0

我试图在 php 中计算这个:

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

为什么它返回 15

预期结果: 16

实际结果:15

4

10 回答 10

3

来自文档: 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
于 2013-09-27T10:00:27.843 回答
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;
于 2013-09-27T09:59:33.557 回答
0

看起来像一个舍入错误

0.1 + 0.7 = 0.7999999999

0.799999999 * 20 = 15.9999998

整数(15.9999998)= 15

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

于 2013-09-27T10:01:21.810 回答
0

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

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

于 2013-09-27T09:59:21.983 回答
0

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

于 2013-09-27T10:00:29.740 回答
0
echo (int)(((0.1*10 + 0.7*10)/10) * 20);

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

echo (0.1+0.7)*20;
于 2013-09-27T10:02:52.893 回答
0

你试过这种方法吗?:

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

我的结果是16

于 2013-09-27T10:02:53.537 回答
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
于 2013-09-27T10:44:28.313 回答
0

请阅读关于浮点数的 PHP 文档。正如文档中所写,

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

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

于 2013-09-27T10:03:31.163 回答
0

使用圆形

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

输出

16
于 2013-09-27T10:05:38.720 回答