PHP 返回错误的值


php return wrong value

我正在尝试在php中计算:

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

为什么返回 15

预期成果: 16

实际结果:15

来自文档: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.99999999999999999991118....

您可以使用BC数学函数

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

你需要

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;

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

如果需要高精度,请改用 GMP 或 bcmath 库。

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

看起来像舍入错误

0.1 + 0.7 = 0.7999999999

0.7999999999 * 20 = 15.9999998

int(15.9999998( = 15

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

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

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

echo (0.1+0.7)*20;

你试过这种方法吗?

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

我的结果是 16

请阅读有关创建点数的 PHP 文档。正如文档中所写,

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

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

使用圆形。

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

输出

16

让我们更准确地说:

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