javascript - 有没有办法提高这个表达式的浮点精度?

标签 javascript floating-point floating-accuracy floating-point-precision chai

我有一个表达式,用于通过在两个值之间进行插值来估计百分位数。

windowMin + (currentPercentile - lastPercentile) * (windowMax - windowMin) / (percentile - lastPercentile)

这给了我非常好的真实世界结果。但是,在我的单元测试中,我无法断言事情是否正常工作,因为我总是遇到严重的舍入错误。

在三个测试用例中,我尝试获得第 40th、第 50 和第 60 个百分位数,从而产生这些计算:

1 + (0.4 - 0.3333333333333333) * (2 - 1) / (0.6666666666666666 - 0.3333333333333333)
1 + (0.5 - 0.3333333333333333) * (2 - 1) / (0.6666666666666666 - 0.3333333333333333)
1 + (0.6 - 0.3333333333333333) * (2 - 1) / (0.6666666666666666 - 0.3333333333333333)

这会产生:

{
  "0.4": 1.2000000000000002,
  "0.5": 1.5,
  "0.6": 1.8
}

我的断言失败了,我的断言正在寻找第 40 个 百分位数的 1.2

有没有办法重构这个表达式以提高所有情况下的准确性?如果没有,是否有一种简单的方法可以使用 chai 断言解决此问题?

最佳答案

这些舍入误差是 float 学的一个特征。

一个可能的解决方案可能是在返回结果之前将 .toPrecision() 应用于您的计算:

var result = windowMin + (currentPercentile - lastPercentile) * (windowMax - windowMin) / (percentile - lastPercentile);
return result.toPrecision(6);  // returns six significant figures

或者可能是toFixed():

return result.toFixed(2); // returns two decimal places.

关于javascript - 有没有办法提高这个表达式的浮点精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18940378/

相关文章:

c - 在进行浮点除法时加倍和返回时是否有任何精度增益?

java - new Double(someString) 和 Double.parseDouble(someString) 有什么区别

c# - 如果首先将 float 保存到变量,则 float 乘法的转换结果会产生不同的结果?

floating-accuracy - 双 float 不准确的来源

javascript - 使用 JavaScript 解析来自 HTTP 请求的网站的 JSON 数据

javascript - 忽略 unicode 转义序列的 jslint 'unnecessary escapement' 错误

javascript - 将选择框更改为自动完成 jquery source php echo

javascript - 无法在 Chrome 扩展程序中提交表单

c++ - 四舍五入到 C 中的次奇数或偶数整数

Java parsefloat 在每个 CPU 上结果相同