当前位置: 首页 > 面试题库 >

如何处理JavaScript中的浮点数精度?

汝飞
2023-03-14
问题内容

我有以下虚拟测试脚本:

function test() {

  var x = 0.1 * 0.2;

  document.write(x);

}

test();

这将打印结果,0.020000000000000004而仅打印结果0.02(如果使用计算器)。据我了解,这是由于浮点乘法精度的错误。

有没有人有一个好的解决方案,这样在这种情况下我可以获得正确的结果0.02?我知道还有类似的函数,toFixed或者四舍五入是另一种可能性,但是我真的想在不进行任何四舍五入的情况下打印出完整的数字。只是想知道你们中的一个人是否有一些不错的,优雅的解决方案。

当然,否则我将四舍五入到大约10位数字。


问题答案:

从浮点指南:

我应该怎么做才能避免这个问题?

这取决于您正在执行哪种计算。

  • 如果您确实需要精确地将结果相加,尤其是在使用金钱时,请使用特殊的十进制数据类型。
  • 如果您只是不想看到所有这些多余的小数位:只需在显示结果时将结果格式舍入为固定的小数位数即可。
  • 如果没有可用的十进制数据类型,则替代方法是使用整数,例如,完全用美分进行货币计算。但这是更多的工作,并且有一些缺点。

请注意,只有在您确实需要特定的精确 十进制
行为时,第一点才适用。大多数人并不需要它,只是因为他们的程序无法正确处理1/10之类的数字而感到恼火,却没有意识到如果发生1/3,即使出现相同的错误也不会眨眼。

如果第一点确实适用于您,请对JavaScript使用BigDecimal,这一点都不优雅,但实际上可以解决问题,而不是提供不完善的解决方法。



 类似资料:
  • 我尝试了两件事: 和:

  • 问题内容: 我对在Go中精确减去2个float的方法感兴趣。 我尝试使用该 库,但无法获得准确的结果。 我使用Javascript中的big.js库解决了此问题。Go算法是否有类似的库/方法? https://play.golang.org/p/vomAr87Xln 问题答案: 包装大 导入“数学/大” func(* Float)字符串 字符串格式x类似于x.Text(’g’,10)。(必须显式调

  • 问题内容: 我需要利用来自另一个系统的数字,这些数字是Java中的128位(四精度)浮点数。 考虑到Java中没有等效类型,我想使用Java代码降低数字的精度,以便将它们存储在Java double中。这可以在c或使用汇编中相当容易地完成,但是我想纯粹在java中完成。 可以假定四精度数存储在Java中的128位字节数组中。 是否有一个很好的解决方案,仅使用java?谢谢。 问题答案: 我对这个问

  • 问题内容: $a = ‘35’; $b = ‘-34.99’; echo ($a + $b); 结果为0.009999999999998 这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。 为什么PHP不返回预期的0.01? 问题答案: 因为浮点运算!=实数运算。对于一些浮子和,由不精确性引起的差异的说明是。这适用于使用浮点数的任何语言。 由于浮点数是具有有限精度的二进制数,因此存在有限数量

  • 本文向大家介绍Fortran 浮点数精度,包括了Fortran 浮点数精度的使用技巧和注意事项,需要的朋友参考一下 示例 类型的浮点数real不能有任何实数值。它们可以表示实数,最多可以包含一定数量的十进制数字。 FORTRAN 77保证了两种浮点类型,而最新的标准则至少保证了两种实数类型。实变量可以声明为 x这是默认类型的实数,并且y是比更大的十进制精度的实数x。在Fortran 2008中,十

  • 在处理浮点数时,我对C#中“精度”的实际含义有些怀疑。如果逻辑性不强,而且解释太长,我提前道歉。 我知道浮点数(例如)的精度为6到9位。假设我们有下一个代码: 我在控制台里得到了确切的数字。现在,让我们使用下一个代码: 打印了一个不同的数字:,即使这个数字有9位数,这也是极限。 这是我的第一个怀疑。精度取决于数字本身还是计算机的结构? 此外,数据以位的形式存储在计算机中,在中间,我记得将数字的小数