首页 > 解决方案 > 在 C# 中从十进制转换时,双精度会丢失吗?

问题描述

例如,我有这样的代码:

double a = 68.24;
double b = 0.01;
double c = a - b;

c等于68.22999999999999。假设我不能改变a,bc(应该double) 的类型。但我可以这样做:

double a = 68.24;
double b = 0.01;
decimal _c = (decimal) a - (decimal) b; 
double c = (double)_c;

现在c68.23,这是我需要的。

但是,如果我有不同的and值,我会失去c转换的精度吗?decimal _cab

更广泛地说,什么时候double失去它的精确性?因为,a并且b在调试器中是精确的(或者至少它是它所显示的),如果我将它们转换为decimal它们也是精确的。但是对它们的操作以某种方式创造了不精确的价值。

标签: c#.nettype-conversiondoubledecimal

解决方案


你知道如果你试着用小数点写出 1/3,它是不可能做到精确的吗?许多二进制值也是如此。在代码中使用浮点值时,您几乎总是只有您认为您拥有的确切值的近似值

decimal类型很有帮助,因为它使用两倍的位来表示一个明显更小的可能值范围(±10 28 vs ±10 300+)。这为我们提供了足够的精度,对于大多数事情来说,舍入误差似乎消失了(它仍然存在,只是太小而无法注意到)。

对于问题中的示例代码,编译器检测到我们只有常量,并且正在优化一些到和从的转换double,所以看起来我们只使用decimal值直到最终输出结果。

假设我不能更改 a、b 和 c 的类型(它应该是双精度的)。

不管那种说法,如果你关心结果的准确性,你可能需要decimal.

那么我们为什么要使用double? 速度。double类型能够利用直接在 CPU 中实现和优化的数学指令,使事情有时比在软件中实现数学运算快 1000 倍。


推荐阅读