【问题标题】:Float lose precision in javascript浮点数在javascript中失去精度
【发布时间】:2022-11-01 18:43:02
【问题描述】:

我有一定数量的代币,我想在一个 web3 项目中烧掉,这个数量是 0.29806008728157019 我想把这个数量传递给 web3.utils.toBN(Math.trunc(amount * 1000000000000000000));,因为它是不变的。我不能将它作为字符串传递的问题,当我使用ParsFloat 解析它时,它变成了0.2980600872815702,这是一个问题,因为我想要完全相同的浮点数。我尝试使用toFixed(17)toPrecision(17),但它们将浮点数更改为字符串并出现同样的问题。 那么我如何在不改变它的情况下将它作为浮点数传递呢?

【问题讨论】:

  • 你想要的根本不可能。值 0.29806008728157019 无法使用 JavaScript 中的数字类型准确表示。
  • 此外,29806008728157019 超过了Number.MAX_SAFE_INTEGER,因此即使您的计算结果值也无法使用数字类型准确表示。
  • 谢谢您的回答 。所以我还有其他解决方案吗?
  • 您不能使用数字类型,因此您必须退回到一些可以处理大量数字的库。 amount 的类型是什么?如果它已经是一个数字,那么精度已经丢失。如果它是一个字符串,您很可能会使用您已经在web3.utils.toBN() 中使用的 BN.js 库。我无法真正在本地对其进行测试,但我认为它会类似于web3.utils.toBN(amound).mul(web3.utils.toBN('1000000000000000000'))。这个表达式的结果已经是一个 BN 实例,所以你不需要在结果上使用web3.utils.toBN()

标签: javascript floating-point precision web3 floating


【解决方案1】:

BigNumber 库需要整数。因此,您要么需要使用BigDecimal library 来执行乘法运算。

然后你会这样做:

let bn = web3.utils.toBN((new bigDecimal("0.29806008728157019"))
  .multiply(new bigDecimal("1000000000000000000"))
  .floor().getValue());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多