【发布时间】:2014-10-30 07:50:18
【问题描述】:
这似乎很简单,但我很难解决这个问题:
我想根据给定的经验值 (exp) 计算等级。因此,我使用立方根公式并向下舍入到下一个整数。当 exp 正好达到level^3 时,达到下一个级别。级别的数量是无限的,所以我会避免使用预先计算好的查找表。
当我使用标准 php 数学时
floor( pow( 10648, 1/3))
它返回 21 而不是 22。这是错误的,因为 21^3 给出了 92161。原因是由于浮点精度有限 pow(10648, 1/3) 返回的不是 22,而是返回 21.9993112732。 你可以用下面的sn-p查看一下:
$lvl = pow( 10647, (float) 1 / 3);
print number_format( $lvl, 10);
这是我的解决方法。但我不确定这是否是防弹的:
public static function getLevel($exp) {
$lvl = floor(pow($exp, (float) 1 / 3)); // calculate the level
if (pow($lvl + 1, 3) == $exp) { // make check
$lvl++; // correct
}
return $lvl;
}
在检查时它看起来有点脆弱。所以问题仍然存在: 是否有一种可靠、高效和防弹的方法来计算立方根(正数)。
谢谢。
【问题讨论】:
-
为什么不用
round()而不是floor()? -
round()在某些情况下也会失败。以7为例。它应该返回级别 1,但round( pow( 7, (float) 1 / 3))返回 2(错误) -
真正的问题是
1/3不能用浮点数精确表示。 -
用 0.333334 代替 1/3 怎么样?它适用于 10647 和 7。
标签: php math floating-point-precision