【发布时间】: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>
我知道有些人使用额外的乘数,但在上面提供的情况下它不起作用。如果您处理加密货币,您就会知道,我们实际上使用的是非乘法和乘法值(例如 489964999999000000 和 0.489964999999)。但我现在的目标是对不同货币的所有法定余额求和,但它们有不同的乘数,所以我不能只对非乘法值求和,而且看起来我需要以某种方式对乘法值求和。
这是一个小背景,但我的一般问题是:
如何求和/乘/等。 15位以上的十进制数?
【问题讨论】:
-
我想你在后台回答了你自己的问题。它说 BigNumber 将接受格式化为字符串的数字作为输入。
-
0.1不是十进制数,而是浮点数据类型。并且这些浮点数据类型不适合十进制计算,因为它们用于不同的目的。这不仅适用于 JS,也适用于任何其他语言。
标签: javascript decimal cryptocurrency