我试图在 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.9999999999999991118...。
您可以使用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;
看起来像一个舍入错误
0.1 + 0.7 = 0.7999999999
0.799999999 * 20 = 15.9999998
整数(15.9999998)= 15
你必须对结果进行四舍五入。
类型转换结果导致错误的数字echo ((0.1 + 0.7) * 20);
应该给出 16
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
让我们更精确一点:
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