我正在测试这段代码脑筋急转弯:
double d1 = 1.000001;
double d2 = 0.000001;
Console.WriteLine((d1 - d2) == 1.0);
结果是“假”。当我更改数据类型时:
decimal d1 = 1.000001M;
decimal d2 = 0.000001M;
decimal d3 = d1-d2;
Console.WriteLine(d3 == 1);
程序写出正确答案:“True”。
本题仅使用浮点数后6位数字。 15位精度发生了什么?
这与精度无关——它与代表性舍入误差有关。
System.Decimal
能够表示大浮点数,并且大大降低了发生像您所看到的那样的舍入错误的风险。System.Single
and System.Double
无法做到这一点,并且会将这些数字四舍五入并产生类似于您在示例中看到的问题。
System.Decimal
使用缩放因子来保存小数位的位置,从而允许精确表示给定的浮点数,而System.Single
and System.Double
只尽可能地估算您的价值。
欲了解更多信息,请参阅System.Double:
请记住,浮点数
只能近似为十进制数,
并且a的精度
浮点数决定如何
准确地说,这个数字近似于
小数。默认情况下,双
值包含 15 位十进制数字
精度,虽然最大为 17
数字是内部维护的。这
浮点数的精度
有几个后果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)