为什么2.4 mod 0.8返回0.8

时间:2017-07-26 14:06:16

标签: javascript php math

为什么2.4乘0.8的模数计算返回0.8?它不应该返回0吗?

在PHP中,通过fmod和JavaScript,通过%发生。

即使是使用此操作的Google研究也失败了:http://www.google.com/search?q=2.4+mod+0.8

2 个答案:

答案 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