我开发了一个 c++ 应用程序(Windows 7、64 位、VS 2008),其中使用了以下公式(所有变量都是 double 类型):
mValue = floor(mValue/mStepping)*mStepping;
这个想法是将数字缩短到给定的小数位数。我认为有更好的方法可以做到这一点,但这不是这里的问题(但如果你有更好的选择,请提出来!)。
mValue 来自用户输入,因此大多数情况下小数位数已经可以了。但在某些情况下,输出与输入不同。
例如,mStepping 的值为 0.1(应该四舍五入到小数点后一位)。现在,如果 mValue 的值为 14.6,则一切正常。如果 mValue 为 14.7,则结果为 14.6。
那么,为什么 floor(14.7/0.1)*0.1 = 14.6 ?
我测试了其他值,其中大约 20% 的值相差 0.1。我进一步挖掘发现,14.7/0.1 的二进制编码与 147.0 不同:
14.7/0.1 = ff ff ff ff ff 5f 62 40
147.0 = 00 00 00 00 00 60 62 40
我知道相同的数字可以以不同的方式编码为双精度数。但是为什么 floor() 以不同的方式处理它们呢?我能做些什么呢?