如果我尝试打印
echo ((0.1 + 0.7) * 10);
输出(http://codepad.org/m3mNNO77)
8
但如果我尝试打印
echo (int)((0.1 + 0.7) * 10);
输出(http://codepad.org/8OTCnlVG)
7
为什么两个不同的结果?
答案 0 :(得分:3)
如果您在没有echo
演员的情况下执行(int)
,则会产生以下结果:
echo ((0.1 + 0.7) * 10);
8
所以会发生的是浮点实际上将其表示为7.99999 ....
当您执行(int)
演员表时,默认行为是采用整数部分,以便7
。8
。虽然它非常接近0.8
,但并不是演员的行为可以完成。
错误是由于浮点数用二进制基数表示的。因此,正确代表0.8
不可能。浮点使答案更圆满,希望它不会那么麻烦。当您表示0.80000...
之类的浮点时,结果为php -a
$ 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
的原因。