110,529
社区成员
Hi,
C#中代码片段如下:
int nStdWorkDays;
double dbStdWorkDaysMin;
nStdWorkDays = 21;
dbStdWorkDaysMin = nStdWorkDays * 0.9;
//此时监视变量dbStdWorkDaysMin 的值,发现竟然是18.900000000000002,而非18.9!
//结果造成 "18.9 < dbStdWorkDaysMin" 为true,逻辑走偏!
这个简单的乘法,结果为什么多了个尾巴00000000000002?类似的坑还有哪些?该如何注意避免?谢谢!
误差精度,是计算机原理。估计没有学原理课程。
比较这类大小要使用类似 double.Epsilon以及其它 XX.Epslion 之类的常量为阈值。
计算机里绝大多数情况下无法准确表示一个浮点数
计算机是内部是二进制的,而人们所说的浮点数是10进制,必然涉及一个转换问题
10进制的0.1意思是1个东西,分为十份,取1份
而二进制数的0.1表示1个东西分两份,取1份,二进制的0.1是10进制的0.5。他们之间转换必有误差。
确实,这种精度问题好麻烦,看了一圈msdn,也是看的有点懵逼,以后都不敢用这些浮点了.... -_-
浮点数不能直接比较大小,应该检查他们的差是否在允许的范围内
你还是使用decimal来进行运算吧,浮点数的四舍五入也是有问题的,在一定范围内,decimal还是精确的
根据业务情境,加了一行代码如下,实现纠偏。
dbStdWorkDaysMin = Math.Round(dbStdWorkDaysMin, 1);
不可能
请先补习一下 浮点数 的知识
将需要运算的两个变量定义为decimal,再进行运算