为什么在PHP中(int)(0.14*100)=13


Why is (int)(0.14*100) = 13 in PHP

对于有经验的人来说,这可能是一个非常容易的问题,但它让我抓狂。

我正在写一个程序,需要画特定数量的微笑。

账户通过以下方式计算:

$cer = userinput 1 / userinput 2
$eer = userinput 3 / userinput 4
$arr = $cer-$eer

所有用户输入都是整数,但$cer、$eer和$arr在大多数情况下都是浮点值,尽管它们可以是整数,具体取决于输入。我在这里没有使用静态铸造。

我想把它表示为一个10x10的微笑网格,其中有快乐、悲伤和不同的微笑作为选项。

我的代码:

$experiment_happy = (int)(100-($eer*100+$arr*100));
$experiment_difference = (int)($arr*100);
$experiment_sad = (int)($eer*100);
echo $experiment_difference."<br>";
echo "<table><tr>";
for ($i = 0; $i < $experiment_happy ; $i++) {
    if ($i % 10 != 0){
       echo "<td><img src='images/happy.gif' width='20' height='20'></td>";
    }else{
        echo "</tr><tr>";
        echo "<td><img src='images/happy.gif' width='20' height='20'></td>";
    } 
}
echo "</tr><tr>";
for ($i = 0; $i < $experiment_difference ; $i++) {
    if ($i % 10 != 0){
        echo "<td><img src='images/difference.gif' width='20' height='20'>   </td>";
    }else{
        echo "</tr><tr>";
        echo "<td><img src='images/difference.gif' width='20' height='20'></td>";
    }
}
echo "</tr><tr>";
for ($i = 0; $i < $experiment_sad ; $i++) {
    if ($i % 10 != 0){
        echo "<td><img src='images/sad.gif' width='20' height='20'></td>";
    }
    else{
        echo "</tr><tr>";
        echo "<td><img src='images/sad.gif' width='20' height='20'></td>";
    }
}
echo"
</tr></table>
";

我对以下数字有问题:用户输入1:100用户输入2:30用户输入3:100用户输入4:17

计算运行良好,但由于某些转换错误,绘制的微笑符号数量不正确。arr计算为0.13,乘以100->13然后将其转换为整数(int)($arr*100),该整数以某种方式返回12。

我哪里错了。我怀疑这与浮点比较或转换为整数有关,但我似乎无法解决这个问题。。

如有任何帮助和解释,我们将不胜感激。

在这里可以看到实时版本。http://niederrad.no-ip.org/alex_test/nnt.php.输入框从上到下代表用户输入1-4,我的问题出现在第二个微笑网格上。

事实并非如此。

echo (int)(0.14 * 100);

输出:-

14

证明

始终尽可能保持数字的精确性,只有在将数字呈现给用户之前才进行舍入。

你说

所有用户输入都是整数

需要注意的一点是,$_GET和$_POST中的任何内容都将是一个字符串,显式地将其转换为您想要的类型,而不是依赖于PHP在这里的松散类型。

两个问题结合在一起产生您所看到的结果:

  • 在任何数字算术系统(整数或浮点、二进制或十进制或其他)中,大多数数字都无法精确表示。精确的数学结果必须是近似的,或者在系统的边界之外
  • 当您将浮点数转换为整数时,结果是截断的值;除去馏分部分

因此,当一个计算产生的数字比你可能想要的略少时,将其转换为整数可能会产生比你想要的少一的数字。

如果你只做了几个简单的计算,不会产生太大的误差,那么你可以用round函数四舍五入到一个整数来解决这个问题。