【问题标题】:Calculate large decimals (more than 15 digits) in Javascript在 Javascript 中计算大小数(超过 15 位)
【发布时间】:2018-04-03 16:19:15
【问题描述】:

我们知道,Javascript 在计算十进制数方面存在一些问题(或特性)。例如:

console.log(0.1 + 0.2) // 0.30000000000000004

我们知道我们可以使用不同的库来避免它(例如我使用bignumber.js),现在我们有了预期的结果:

console.log(Number(new BigNumber(0.1).plus(0.2))); // 0.3
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

但是

Bignumber.js 有局限性:

它接受 number 类型的值(最多 15 个有效数字), 字符串或 BigNumber 对象。

我们可以传递一个字符串(这是可能的),但是这样我们可以从末尾丢失一些数字:

console.log(Number(new BigNumber(0.1).plus("198.43092534959501"))); // 198.530925349595, not 198.53092534959501
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

现在我使用加密货币,并且经常处理像198.43092534959501 这样的数字,在这种情况下,我收到一个错误(如预期的那样):

console.log(Number(new BigNumber(0.1).plus(198.43092534959501))); // error
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

我知道有些人使用额外的乘数,但在上面提供的情况下它不起作用。如果您处理加密货币,您就会知道,我们实际上使用的是非乘法和乘法值(例如 4899649999990000000.489964999999)。但我现在的目标是对不同货币的所有法定余额求和,但它们有不同的乘数,所以我不能只对非乘法值求和,而且看起来我需要以某种方式对乘法值求和。

这是一个小背景,但我的一般问题是:

如何求和/乘/等。 15位以上的十进制数?

【问题讨论】:

  • 我想你在后台回答了你自己的问题。它说 BigNumber 将接受格式化为字符串的数字作为输入。
  • 0.1 不是十进制数,而是浮点数据类型。并且这些浮点数据类型不适合十进制计算,因为它们用于不同的目的。这不仅适用于 JS,也适用于任何其他语言。

标签: javascript decimal cryptocurrency


【解决方案1】:

我已经在评论中回答了这个问题,但这里有一个演示。 BigNumber 将接受字符串格式的数字作为输入。

console.log(new BigNumber(0.1).plus("198.43092534959501"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

【讨论】:

  • 是的,它有效,谢谢,但在这种情况下,最后 2 位数字丢失了。有没有办法保留完整的数字?
  • 不要将其转换回 Number 并且保留 BigDecimal 配置使用的任何位数,对吗?
  • 我已经更新了答案。最后一位数字丢失了,因为您的样本将其转换回数字。只需始终将数字保留为字符串或 BigNumber。
  • 很好的答案,谢谢(也感谢@ScottSauyet)!我希望我们可以用数字来做到这一点,但如果不能 - 没关系,我会调整自己。再次感谢!
  • JavaScript 无法保持这种精确度。位数分辨率包含在语言规范中,因此需要库来处理这么大的任何事情。在 NodeJS 中使用加密密钥文件格式时,我也遇到了同样的问题。
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2012-03-02
  • 2018-09-02
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多