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

时间:2013-12-10 18:32:56

标签: php floating-point

对于经验丰富的人来说,这可能是一个非常简单的问题,但它让我疯狂。

我正在编写一个需要绘制特定数量的表情符号的程序。

帐户的计算方法如下:

$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>
";

我遇到以下数字的问题: userinput 1:100 userinput 2:30 userinput 3:100 userinput 4:17

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

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

非常感谢任何帮助和解释。

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

2 个答案:

答案 0 :(得分:1)

不是它= = 14。

echo (int)(0.14 * 100);

输出: -

14

Proof

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

你说

  

所有用户输入都是整数

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

答案 1 :(得分:0)

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

  • 在任何数值运算系统(整数或浮点,二进制或十进制或其他)中,大多数数字都无法准确表示。精确的数学结果必须近似或超出系统范围。
  • 将浮点数转换为整数时,结果为截断值;分数部分被删除。

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

如果您只进行一些不会产生太多错误的简单计算,那么您可以通过使用round函数舍入到整数来解决此问题。