【问题标题】:Trying to handle big numbers with bignumber.js尝试使用 bignumber.js 处理大数字
【发布时间】:2015-06-25 14:52:06
【问题描述】:

我的问题是我必须在javascript中使用大数字(大小数)进行计算,例如:

1.1e-40 + 1.1e-40 

Javascript 最多只支持 16 位的精度。所以我恢复到 MikeMcl bignumber.js 的库

As explained in the API,执行您所做的计算:

var y1 = new BigNumber(1.1e-40)   
var y2 = new BigNumber(1.1e-40)  

var yy = y1.plus(y2);

但是,yy 返回一个带有

的对象
c: [220], e: -40 and s: 1

我怎样才能用它来取回原来的号码?

例如,我尝试过:yy.c * Math.pow(10, yy.e),但这会导致舍入错误:2.1999999999999998e-38

【问题讨论】:

  • 如果您能够获得“原始”号码,那么一开始就没有理由使用 BigNumber。还有mikemcl.github.io/bignumber.js/#toN(但这当然也无济于事)。也许你想要mikemcl.github.io/bignumber.js/#toS
  • 我不知道你在问什么。你知道 JS 不能代表一些数字,但你还在努力?
  • 我认为如果您必须将数字返回到“JS-land”中,您可能必须将其四舍五入到 JS 可以表示的值。根据您的需要,另一种选择是将其作为字符串持久化。
  • 你得到的只是另一个 BigNumber 对象。是要“取回原数”来存储或显示,还是要进行进一步的计算?
  • @FelixKling 这不是真的。从数学上讲,您可能确定结果 可以用 53 位表示,但中间操作不是。例如,考虑模运算。所以有理由使用 BigNumber 但将结果转换为 Number。

标签: javascript bignum bignumber.js


【解决方案1】:

正如@Felix Kling 在评论中所说,如果你想使用原生 js 号码,你也会得到它们的限制。

但是,您可以打印bignumbers as strings,例如yy.toString()

你想将它们从字符串转换为原生 js 数字,忽略缺点吗?使用parseFloat()parseFloat(ee.toString())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多