php返回错误的值

时间:2013-09-27 09:54:04

标签: php

我试图在php中计算:

echo (int)((0.1 + 0.7) * 20);

为什么它返回15

预期结果: 16

实际结果:15

10 个答案:

答案 0 :(得分:3)

来自doc:http://php.net/manual/en/language.types.float.php

  

浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播。

     

此外,有理数可以完全表示为基数10中的浮点数,如0.1或0.7,没有精确表示为基数2中的浮点数,无论大小如何都在内部使用尾数。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....

您可以使用BC Math Functions

$precision = 2;
echo bcmul( bcadd("0.1","0.7",$precision) ,"20",$precision); // 16.00

答案 1 :(得分:1)

你需要

intval ((0.1 + 0.7) * 20);
抱歉,这是错误的,但这是一个解决方法:

$n= ( (0.1 + 0.7) * 20);  //=16
$n2 = intval ($n."");     // cast it to string, then to int.
echo $n2;

答案 2 :(得分:0)

这是由PHP将小数转换为二进制等效值造成的,这会导致精度损失。

如果您需要高度准确,请改用GMPbcmath库。

答案 3 :(得分:0)

类型转换结果导致错误的数字echo ((0.1 + 0.7) * 20);应该给出16

答案 4 :(得分:0)

看起来像一个舍入错误

0.1 + 0.7 = 0.7999999999

0.799999999 * 20 = 15.9999998

int(15.9999998)= 15

你必须对结果进行四舍五入。

答案 5 :(得分:0)

echo (int)(((0.1*10 + 0.7*10)/10) * 20);

首先,你需要摆脱小数,然后执行操作 否则不要进行类型转换

echo (0.1+0.7)*20;

答案 6 :(得分:0)

你尝试过这种方法吗? :

<?php
$value = (0.1+0.7)*20;
echo $value;
?>

我的结果是 16

答案 7 :(得分:0)

请阅读PHP documentation on foating point numbers。正如文档中所写,

  

例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8。

使用浮点数时,请使用BC Math来获得正确的结果。

答案 8 :(得分:0)

使用round

echo round((0.1 + 0.7) * 20);

<强>输出

16

答案 9 :(得分:0)

让我们更精确:

printf("%1\$.20f", 0.7); // output: 0.69999999999999995559
printf("%1\$.20f", 0.1); // output: 0.10000000000000000555
printf("%1\$.20f", (0.10000000000000000555+0.69999999999999995559)*20); // output: 15.99999999999999822364

所以当您将最后一个数字转换为int:

echo (int)15.99999999999999822364; // output: 15