【发布时间】:2013-01-30 16:05:50
【问题描述】:
我需要在 JavaScript 中计算两个实数之间的中点(平均值)。数字的范围可以变化很大,一般在 10000 到 0.0001 之间。
天真的方法
(parseFloat(first) + parseFloat(second)) / 2
给我不需要的精度错误,即
(1.1 + 0.1) / 2 = 0.6000000000000001
如何确保结果没有多余的小数位?我想,由于只有两个输入,因此结果最多需要比输入多一位小数。所以,我需要:
1000 and 3000 to return 2000 (without decimal spaces)
1234.5678 and 2468.2468 to return 1851.4073
0.001 and 0.0001 to return 0.00055
10000 and 0.0001 to return 5000.00005
0.1 and 1.1 to return 0.6
澄清一下:我完全了解精度误差以及为什么会发生这种情况。我需要的是一个简单的解决方法,但我无法在 SO 上找到以前的解决方案。
【问题讨论】:
-
您需要 1) 阅读一些关于计算中数字的基础知识(主要是 IEEE754)2) 在显示时格式化您的数字。
-
或者甚至使用谷歌,或Stack Overflow 自己的搜索来找到无数关于为什么会发生这种情况的问题。我很惊讶您没有使用这种具有如此高声誉的方法。我建议尝试一件事:
alert(parseFloat("0.1"));你会感到惊讶... -
@dystroy 了解规范并不能真正帮助我
-
@SWeko 是的,它会...尝试将 0.6 写为二进制数。然后你会看到会发生什么。在 Java 中,这就是我们使用 BigDecimal 等的原因。这是good question about this。特别是 toFixed 很有趣
-
@ppeterka 好的,让我换个说法:Javascript 的 BigDecimal 在哪里?
标签: javascript average