0

鉴于以下鳕鱼:

 $number = 1050.55;
 var_dump($number - floor($number));

为什么上面的代码会返回以下结果?

float(0.54999999999995)

在这种情况下,我想要一个像 0.55 这样的固定值。你能帮我吗?

4

3 回答 3

3

浮点运算不精确,余数错误很常见。如果您知道,您想要的精度是多少(例如,点后的两位数),您可以对结果使用 round() 函数。在这种情况下,这将是:

$number = 1050.55;
var_dump(round($number - floor($number), 2));
于 2012-05-18T23:13:34.057 回答
2

对于大多数浮点数,二进制只能近似表示正确的数字。规则是在一系列计算中最后执行 floor()、ceil() 或 fmod()。至少在你使用它们之后才做整数数学。如果您将 int 转换为浮点数,就像在您的代码中一样,那么 floor() 不会像您期望的那样表现。

打印浮点数时使用 printf()。它的转换例程通常做得更好,并在截断浮点数时为您提供您期望的答案。

编辑:或者,更准确地说, printf() 在决定截断位置时处理数字的十进制字符表示,因此您不会得到任何奇怪的、未指定的二进制/十进制转换伪影。

于 2012-05-18T23:35:08.050 回答
1

看到这个问题。虽然那是关于 java 并且你问的是 PHP,但数学是一样的。

于 2012-05-18T23:09:52.383 回答