PHP奇怪的浮点不精确

时间:2015-01-05 14:22:09

标签: php

如果我尝试打印

echo ((0.1 + 0.7) * 10);

输出(http://codepad.org/m3mNNO77

8

但如果我尝试打印

echo (int)((0.1 + 0.7) * 10);

输出(http://codepad.org/8OTCnlVG

7

为什么两个不同的结果?

2 个答案:

答案 0 :(得分:3)

如果您在没有echo演员的情况下执行(int),则会产生以下结果:

echo ((0.1 + 0.7) * 10);
8

所以会发生的是浮点实际上将其表示为7.99999 ....

当您执行(int)演员表时,默认行为是采用整数部分,以便78。虽然它非常接近0.8,但并不是演员的行为可以完成。

错误是由于浮点数用二进制基数表示的。因此,正确代表0.8 不可能。浮点使答案更圆满,希望它不会那么麻烦。当您表示0.80000...之类的浮点时,结果为php -a

使用PHP交互式shell($ php -a Interactive mode enabled php > echo number_format(((0.1 + 0.7) * 10),20)."\n"; 7.99999999999999911182 php > echo number_format(0.8,20); 0.80000000000000004441

概念证明

{{1}}

答案 1 :(得分:3)

正如您可能知道的那样,由于表示的限制,浮点数学并不准确。

(0.1 + 0.7) * 10可以使用7.99999999999...

echo输出时,使用舍入将数字转换为字符串,该字符串使用php.ini precision设置(默认情况下为15)限制十进制数的数量。碰巧这个舍入恰好给出了8

但是,(int)将float转换为整数,这是通过截断来完成的。无论你接近下一个整数,它都总是向下舍入。这就是你在这里获得7的原因。