最近在使用 Math.Round()的时候发现一个问题,感觉很奇怪,想不通,请各位大侠指点。
double cc = 0.068627450980392163;
double aa = Math.Round(cc, 4); // aa=0.0686
double bb = Math.Round(cc, 4) * 100; // bb=6.8599999999999994
如上所示三行代码,我本意是想四舍五入,精确到小数点后4位后乘以100得出一个数值,
期望数值是6.86
但实际上四舍五入后乘以100的数值结果并不是期望值,好像并没有精确后四位。
想要得到期望值,貌似只能把cc值先乘以100后再调用Math.Round()。不知道这是什么原因。有知道的吗
不確定如何不服你的期望
測試結果是6.86沒錯
附上測試代碼給你參考
https://dotnetfiddle.net/fCzoVN
Console.WriteLine(bb);输出的结果应该是截取精度了,你可以打断点看下bb的值是多少,并不是6.86
@lymyyang:
如果對精度有疑慮
就不應該使用運算浮點數(如: double, float)
應該改用精準浮點數: decimal
代碼如下
https://dotnetfiddle.net/C7cBFv
建议用decimal,如果需要精确计算的话。还有,实际上这个函数的结果不是通常意义上的四舍五入,而是四舍六入五成双算法吧
嗯嗯,跟一楼的建议一样,自己确实对float,double,decimal的使用场景不清楚,只知道表示的数值范围大小有差异而已。
针对这个问题,确实很惊讶,只round一下的话确实是期望的结果0.0686,但是继续乘以100,就不是6.86了,感觉好神奇,不知道是哪里的问题
@lymyyang: 没研究过,有空试试。不过decimal比较消耗性能,它不是一个一般意义上的浮点数,而是一个class
你自己用该数二进制和十进制按照浮点数规范互转一下就不觉得奇怪了。
很多时候都是近似值不是准确值,因为无法相等换算过去。