在 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,这就是我需要的。

但是,如果我有不同的a值和b值,我是否会失去从decimal_c转换c精度?

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

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

decimal类型会有所帮助,因为 is 使用两倍的位来表示明显更小的值范围(±1028与 ±10300+)。这给了我们足够的精度,对于大多数事情,舍入误差似乎消失了(它仍然存在,只是太小而无法注意到)。

对于问题中的示例代码,编译器正在检测我们只有常量,并且正在优化一些与double之间的转换,因此似乎我们只使用decimal值,直到最终输出结果。

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

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

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

相关内容

  • 没有找到相关文章

最新更新