为什么此代码打印的结果为'7'?

L.L*_*iet 9 php

我最近开始学习PHP.

   <?php
    echo (int) ( (0.1+0.7) * 10 ); // prints '7', why not '8' ?
    ?>
Run Code Online (Sandbox Code Playgroud)

请让我相信这种类型转换过程.

Jam*_*win 12

来自PHP.net

通常,像0.1或0.7这样的简单小数部分不能转换成它们的内部二进制对应,而不会有很小的精度损失.这可能会导致混乱的结果:例如,floor((0.1 + 0.7)*10)通常会返回7而不是预期的8,因为内部表示将类似于7.9.

这是因为不可能用有限数字的十进制表示法表示一些分数.例如,十进制形式的1/3变为0.3.

  • @ L.Lawliet,尝试在基数2中写出像.1或.7这样的小数,看看你是否得到一个有限数.如果您使用.5或其他可以轻松转换为base 2的内容,我认为您没有相同的问题,但除非您了解基本转换,否则不是那么明显. (3认同)

Dir*_*mar 7

您遇到浮点不准确.

0.1 + 0.7不完全是0.8,但略小.转换为int只是截断值,结果为7.

要获得正确的结果,请使用舍入:

<?php
    echo (int) round( (0.1+0.7) * 10 ); 
?>
Run Code Online (Sandbox Code Playgroud)