我正在尝试在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