我最近开始学习PHP。
<?php
echo (int) ( (0.1+0.7) * 10 ); // prints '7', why not '8' ?
?>
请说服我这种类型转换过程。
答案 0 :(得分:12)
来自PHP.net
通常,像0.1或0.7这样的简单小数部分无法在没有很小精度损失的情况下转换为其内部二进制对应部分。这可能导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9。
这是因为不可能用有限数字的十进制表示法表示一些分数。例如,十进制形式的1/3变为0.3。
答案 1 :(得分:7)
您遇到浮点不准确。
0.1 + 0.7并不完全是0.8,但略低。转换为int只是截断值,结果为7。
要获得正确的结果,请使用舍入:
<?php
echo (int) round( (0.1+0.7) * 10 );
?>
答案 2 :(得分:1)
来自http://php.net/manual/en/language.types.float.php
通常是简单的小数 像0.1或0.7的分数不能 转换成内部二进制文件 对手没有一点损失 精确。这可能会导致混淆 结果:例如, 通常((0.1 + 0.7)* 10) 返回7而不是预期的8, 因为内部代表会 就像7.9。
答案 3 :(得分:1)
正如其他人所说,这是由于精确度的降低,如下所示:
<?php
printf("%30.27f\n", (0.1 + 0.7) );
printf("%d\n", (int) (0.1 + 0.7) );
printf("%30.27f\n", ( (0.1+0.7) * 10 ) );
printf("%d\n", (int) ((0.1 + 0.7) * 10) );
?>
输出:
0.799999999999999933386618522
0
7.999999999999999111821580300
7
答案 4 :(得分:0)
您可能会看到浮点舍入错误,当您int()
时,它会从7 ... 9变为7。
答案 5 :(得分:0)
我不确定,但这可能是因为int cast是截断的。
.1 + .7可能会导致.799999999999999999999999和
乘以10 = 7.9999999999999999999
(int)将此截断为7。