c# - 在 C# 中从十进制转换时,双精度会丢失吗?
问题描述
例如,我有这样的代码:
double a = 68.24;
double b = 0.01;
double c = a - b;
c
等于68.22999999999999
。假设我不能改变a
,b
和c
(应该是double
) 的类型。但我可以这样做:
double a = 68.24;
double b = 0.01;
decimal _c = (decimal) a - (decimal) b;
double c = (double)_c;
现在c
是68.23
,这是我需要的。
但是,如果我有不同的and值,我会失去c
转换的精度吗?decimal
_c
a
b
更广泛地说,什么时候double
失去它的精确性?因为,a
并且b
在调试器中是精确的(或者至少它是它所显示的),如果我将它们转换为decimal
它们也是精确的。但是对它们的操作以某种方式创造了不精确的价值。
解决方案
你知道如果你试着用小数点写出 1/3,它是不可能做到精确的吗?许多二进制值也是如此。在代码中使用浮点值时,您几乎总是只有您认为您拥有的确切值的近似值。
该decimal
类型很有帮助,因为它使用两倍的位来表示一个明显更小的可能值范围(±10 28 vs ±10 300+)。这为我们提供了足够的精度,对于大多数事情来说,舍入误差似乎消失了(它仍然存在,只是太小而无法注意到)。
对于问题中的示例代码,编译器检测到我们只有常量,并且正在优化一些到和从的转换double
,所以看起来我们只使用decimal
值直到最终输出结果。
假设我不能更改 a、b 和 c 的类型(它应该是双精度的)。
不管那种说法,如果你关心结果的准确性,你可能需要decimal
.
那么我们为什么要使用double
? 速度。该double
类型能够利用直接在 CPU 中实现和优化的数学指令,使事情有时比在软件中实现数学运算快 1000 倍。
推荐阅读
- java - local dynamodb consumed read units
- html - Title tooltip of fixed positioned button immediately disappears in Firefox
- python - 由于 ImportError,pyuic5.bat 无法正常工作
- javascript - 使用JS在同一div中的其他元素之前插入元素
- node.js - 用于开发和运行新应用程序的 NodeJS 服务器 GUI 工具
- r - 将线性函数放在正交系统上
- eclipse-plugin - 在 Eclipse neon 中安装 TestNG 时出错
- r - 实现适合 R 的条件
- python - 即使定义了函数也没有定义?Python的简单哈希实现
- sql - 将单独列中的分类数据合并为具有类别指示符的单个列