鉴于以下鳕鱼:
$number = 1050.55;
var_dump($number - floor($number));
为什么上面的代码会返回以下结果?
float(0.54999999999995)
在这种情况下,我想要一个像 0.55 这样的固定值。你能帮我吗?
浮点运算不精确,余数错误很常见。如果您知道,您想要的精度是多少(例如,点后的两位数),您可以对结果使用 round() 函数。在这种情况下,这将是:
$number = 1050.55;
var_dump(round($number - floor($number), 2));
对于大多数浮点数,二进制只能近似表示正确的数字。规则是在一系列计算中最后执行 floor()、ceil() 或 fmod()。至少在你使用它们之后才做整数数学。如果您将 int 转换为浮点数,就像在您的代码中一样,那么 floor() 不会像您期望的那样表现。
打印浮点数时使用 printf()。它的转换例程通常做得更好,并在截断浮点数时为您提供您期望的答案。
编辑:或者,更准确地说, printf() 在决定截断位置时处理数字的十进制字符表示,因此您不会得到任何奇怪的、未指定的二进制/十进制转换伪影。
看到这个问题。虽然那是关于 java 并且你问的是 PHP,但数学是一样的。