对于有经验的人来说,这可能是一个非常容易的问题,但它让我抓狂。
我正在写一个程序,需要画特定数量的微笑。
账户通过以下方式计算:
$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
函数四舍五入到一个整数来解决这个问题。