在 C# 中从十进制转换时会失去精度吗?

Posted

技术标签:

【中文标题】在 C# 中从十进制转换时会失去精度吗?【英文标题】:Can double lose its precision when converting from decimal in C#? 【发布时间】:2021-10-19 17:54:33 【问题描述】:

例如,我有这样的代码:

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

c 等于 68.22999999999999。假设我不能更改abc 的类型(它应该double)。但我可以这样做:

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

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

但是如果ab 的值不同,我会失去从decimal _c 转换的c 的精度吗?

更广泛地说,当double 失去精度时?因为,调试器中的ab 是精确的(或者至少是它所显示的),如果我将它们转换为decimal,它们也是精确的。但是对它们的操作不知何故会产生不精确的价值。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于在 C# 中从十进制转换时会失去精度吗?的主要内容,如果未能解决你的问题,请参考以下文章

在c#中将十进制值转换为两个精度[重复]

c# 中从十六进制到字节的最轻量级转换? [复制]

C# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号

保存到 DB、C# 时会丢失十进制精度。我正在使用实体框架 [重复]

C#类型转换

C#类型转换