奇怪的 Javascript 行为:浮点加法给出了错误的答案

新手上路,请多包涵

可能重复:

JavaScript 的数学有问题吗?

这看起来真的很愚蠢,但是当运行它时,它会显示

7.300000000000001 而不是 7.3

 <script language="javascript">
    function buttonClicked() {
        var mySum = 1.1 + 1.1 + 1.1 + 0 + 4;
        alert(mySum);
    }
</script>

什么会导致这个?我在一个非常基本的 aspx 页面上有 javascript。我们实际上是在使用 javascript 将表单输入的值相加,这只是一个打破它的数字的例子,还有很多其他的……

知道这是做什么的吗?!?

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 371
2 个回答

它与如何将十进制值转换为二进制浮点数有关。 110 在二进制中变成了一个重复的小数,所以这个数字并不能完美地表示出来,重复的运算会暴露错误。

JavaScript 使用 IEEE-754 浮点数,作为记录。其他一些语言也有同样的问题。

如何处理?在你的情况下,也许 toPrecision()

原文由 Nosredna 发布,翻译遵循 CC BY-SA 2.5 许可协议

浮点数存储为数字部分(尾数)和指数(小数点移动多少位)。定位点数的尾数部分存储为分数之和。它们是通过添加一系列分数来计算的。分数的顺序是:

 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, ... etc

二进制表示形式存储为 0 和 1,表示是/否。例如,001010 将是 0 * 12 + 0 * 14 + 1 * 18 + 0 * 116 + 1 * 1/32。

这是一个粗略的例子,说明为什么浮点数不能精确。当您增加精度(float -> double -> long double)时,您会获得更高的精度。

存储的底层二进制数据被分成两部分 - 一个用于出现在小数点之前的部分,另一个用于出现在小数点之后的部分。这是一个 IEEE 标准,由于执行计算的速度(可能还有其他因素)而被采用。

查看此链接以获取更多信息: https ://en.wikibooks.org/wiki/A-level_Computing/AQA/Paper_2/Fundamentals_of_data_representation/Floating_point_numbers

原文由 Kieveli 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题