javascript 处理浮点错误的最佳方法是什么?[已关闭]

1szpjjfi  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(70)

已关闭,此问题为opinion-based。它目前不接受回答。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

30分钟前关闭
Improve this question
所以我有一个JavaScript脚本,它在一个循环中将小分数加在一起,它可能会将0.2加到0.1。然后,该值被馈送到另一个函数,但问题是我需要精确地馈送0.3,而不是0.3000000000004。
什么是最简单的方法来确保数字是正确的和准确的。请注意,它可能得到0.25+0.125等被添加到简单的四舍五入到1小数不会解决这个问题。
也有可能增加0.2 + 0.10000000000004,尽管这是非常非常不可能的!

5uzkadbs

5uzkadbs1#

在通用浮点运算中,没有简单的方法可以避免舍入误差。数字0.3没有精确的二进制浮点表示。
我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic来熟悉浮点数表示所固有的权衡。
为了真正解决你的问题,你应该问自己几个问题:

  • 您对精度的要求有多严格?为什么0.30000000000000004在你的误差范围之外?对结果进行四舍五入是否可以接受?
  • 有没有什么方法可以让你用整数来表示数字,并进行大部分的算术运算?例如,如果你知道你只会遇到 * 有理数 *,它们可以用整数商和整数分母来表示。从那里开始,您可以尝试尽可能长时间地延迟转换为浮点型,以防止累积舍入错误。
  • 如果不能对整数执行计算,是否可以使用其他数据类型,例如BigDecimal

最终,当涉及到浮点精度问题时,您通常必须根据特定问题提出的要求定制解决方案。

eagi6jfj

eagi6jfj2#

我用的是这个:

/// My value with floating point error
float fValue = 0.5000001;
fValue = (int)(fValue * 100) / 100;

您可以通过更改'100'值来调整浮点精度。
你总是可以把它放在一个很好的函数上:D
注意:我在Unity Engine(C#)中使用它。

相关问题