为什么2.4乘0.8的模数计算返回0.8?它不应该返回0吗?
在PHP中,通过fmod
和JavaScript,通过%
发生。
即使是使用此操作的Google研究也失败了:http://www.google.com/search?q=2.4+mod+0.8
答案 0 :(得分:0)
简单地说,为了用十进制表示数字,我们做这样的事情:
1550 = 1000 + 5·100 + 5·10 = 1·10³ + 5·10² + 5·10¹
为了用十进制表示二进制形式的数字,你必须改变基数:
106 = 2^6 + 2^5 + 2^3 + 2^1 = 0110 1010
其中0将等于0·2 ^ 7,0·2 ^ 4等
正如你所看到的那样,模式是清晰的:只需要根据需要加上2的幂,直到你得到你想要的数字,直到你得到数字1的0(2 ^ 0)。如果你把事情做得更进一步它会起作用小数相同,你只需从权力中减去1:
0.5 = 2^-1 = 1/2^1
现在有其他数字:
0.6875 = 0.1011 = 1/2^1 + 1/2^3 + 1/2^4
然而,有些数字你不能表示为2的反幂的和,像0.1
这样简单的事情应该要求你添加非常小的数字来接近那个值,看起来像{{1其实实际上是0.0001100110011...
,因为每当你需要做算术时语言必须改变基数,这些问题就会出现。
答案 1 :(得分:0)
如果你仔细观察这个具体例子中发生的事情,二进制格式的影响就会变得更加明显。
输入存储为二进制浮点近似。然后可以将其打印为唯一标识二进制的十进制数,
In [1]: print "%.25f"%2.4
2.3999999999999999111821580
In [2]: print "%.25f"%0.8
0.8000000000000000444089210
第一步是计算商及其整数部分。显然,由于存储的数字较小2.4
且较大0.8
,因此商数小于3
,
In [3]: print "%.25f"%(2.4/0.8)
2.9999999999999995559107901
模数结果,余数,最后是去除整数倍后的差异,
In [4]: print "%.25f"%(2.4-2*0.8)
0.7999999999999998223643161