echo (int) ( (0.1+0.7) * 10 );
为什么以上输出7?我理解PHP如何向0舍入,但不是(0.1+0.7) * 10
被评估为一个浮点数,然后作为一个整数被转换?
谢谢!
答案 0 :(得分:7)
答案 1 :(得分:2)
参见手册:
http://php.net/manual/en/language.types.float.php
通常是简单的小数 像0.1或0.7的分数不能 转换成内部二进制文件 对手没有一点损失 精确。这可能会导致混淆 结果:例如, 通常((0.1 + 0.7)* 10) 返回7而不是预期的8, 因为内部代表会 就像7.9。
答案 2 :(得分:1)
其他答案解释了为什么会发生这种情况。这应该可以满足您的需求:
echo (int) round( (0.1+0.7) * 10 );
在将其转换为int之前,将舍入浮动。
答案 3 :(得分:0)
我没有安装php,但在python:
$ python
>>> 0.1+0.7
0.79999999999999993
>>>
并非基数为10的所有数字都可以在base 2系统中精确表示。检查维基百科文章:
二进制中的分数。特别是,这一行:
Fraction Decimal Binary Fractional Approx.
1/10 0.1 0.000110011... 1/16+1/32+1/256...
1/10不能在基数2中以有限的方式表示。因此,在基数2中不能精确计算0.1 + 0.7。
从不假设浮点计算是精确的,它迟早会咬你。
答案 4 :(得分:0)
1/10不能用有限数量的二进制数字表示,就像1/3不能表示为有限数量的基数为10的数字。因此,您实际上将0.09999999999999 ...和0.69999999999999加在一起... - 总和几乎 8,但不完全。