Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么此代码会打印';7';?_Php - Fatal编程技术网

Php 为什么此代码会打印';7';?

Php 为什么此代码会打印';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

   <?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.7999999999933386618522
0
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中尝试了类似的代码,得到了相同的结果。我以前用其他语言编程时确实没有注意到这一点。所以我可以说所有的语言和脚本都是这样处理数字的吗?不,这取决于所使用的浮点表示法:但大多数使用相同的表示法。