Php 为什么此代码会打印';7';?
我最近开始学习PHPPhp 为什么此代码会打印';7';?,php,Php,我最近开始学习PHP <?php echo (int) ( (0.1+0.7) * 10 ); // prints '7', why not '8' ? ?> 请让我相信这个类型转换过程。您可能看到浮点舍入错误,当您int()它时,它从7…9变为7。来自PHP.net 典型的情况是,简单的十进制分数(如0.1或0.7)无法在不损失少量精度的情况下转换为内部二进制分数。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10)通常会返回7,而不
<?php
echo (int) ( (0.1+0.7) * 10 ); // prints '7', why not '8' ?
?>
请让我相信这个类型转换过程。您可能看到浮点舍入错误,当您
int()
它时,它从7…9变为7。来自PHP.net
典型的情况是,简单的十进制分数(如0.1或0.7)无法在不损失少量精度的情况下转换为内部二进制分数。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10)通常会返回7,而不是预期的8,因为内部表示类似于7.9
这是因为不可能用有限位数的十进制表示法来表示某些分数。例如,十进制形式的1/3变为0.3
从
这是典型的简单十进制
不能使用0.1或0.7之类的分数
转换为它们的内部二进制文件
没有小损失的同行
精确这可能导致混淆
结果:例如,
地板((0.1+0.7)*10)通常
返回7而不是预期的8,
因为内部代表将
大概是7.9
我不确定,但这可能是因为int cast正在截断 .1+.7可能导致.799999999999999和 将该值乘以10=7.999999999999
(int)将其截断为7。您遇到了浮点不准确的问题
0.1+0.7并不完全是0.8,但稍小一些。转换为int只会截断该值,并得到7作为结果 要获得正确的结果,请使用舍入:
<?php
echo (int) round( (0.1+0.7) * 10 );
?>
正如其他人所说,这是由于精度损失,如下所示:
<?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.79999999999333866185220
7.99999999999999911182158300
七,
我想解释一下,四舍五入的值将补偿精度的损失。“0.1+0.7不完全是0.8,但稍微小一些。”但这是什么原因呢?PHP必须考虑像这样运行。查看每个程序员应该知道的关于浮点运算的所有技术细节。+1,如果只是引用PHP.net的最后一段话。如果不使用无限内存,就不可能表示某些分数。这导致这些分数被表示为略小于其应有值(因为它们必须被截断为有限数量的位),从而产生舍入误差。因此,无论是什么数字,它都会被截断一点,甚至可以用有限数量的位(如0.1+0.7)保存它。@L.Lawliet,试着在基数2中写出一个像.1或.7这样的小数,看看你是否得到一个有限的数字。如果您使用的是.5或其他可以轻松转换为base 2的工具,我认为您不会遇到同样的问题,但除非您了解base conversion,否则就没有那么明显了。天哪。。我在C中尝试了类似的代码,得到了相同的结果。我以前用其他语言编程时确实没有注意到这一点。所以我可以说所有的语言和脚本都是这样处理数字的吗?不,这取决于所使用的浮点表示法:但大多数使用相同的表示法。