在Javascript中,最大的Number是多少?
发布于 12 年前 作者 fengmk2 93630 次浏览 最后一次编辑是 8 年前

今天在团队里,又遇到的大Number的讨论。想起去年FaWave 在处理网易微博id的时候同样遇到过这个问题,先抛出一个js的库,大家从这里开始,发表下你的经历吧。

Scheme arithmetic library for JavaScript

16 回复

这个库是我以前在找的,一直没有找到,都是一些关于数学算法的库。

好像没有发布到NPM上面

  • 我们前段时间在开发中还遇到过这个问题,由Java的64位的long型传到页面再传到后台使用,结果达到上限了,还仔细研究了下Number的最大值问题,具体可参考这个 http://en.wikipedia.org/wiki/Double_precision_floating-point_format
  • 得出的结论是java的long不能用javascript的number表示出上限,需要用string代替来传值,否则会丧失精度

这个在Javascript权威指南 第六版 3.1小节有阐述,大概意思总结如下:

Number类型统一按浮点数处理,64位存储,整数是按最大54位来算最大最小数的,否则会丧失精度;某些操作(如数组索引还有位操作)是按32位处理的~~

浮点数范围:

as  large  as ±1.7976931348623157 × 10的308次方
as small as ±5 × 10的−324次方

精确整数范围:

The JavaScript number format allows you to exactly represent all integers between
−9007199254740992  and 9007199254740992 (即正负2的53次方)

数组索引还有位操作:

正负2的31次方

正是这个原因,mysql的驱动直接将整数全部自动转换程String了.

@suqian

  • 你们直接转化数字为string了?那对存储和业务不会有很大影响吗?索引啊,以前的代码啊什么的
  • 还记得以前遇到过另一个数字问题,java与c++的高低字节问题。。。

这个文章能置顶么?

谁可以帮忙开发一个“置顶”功能呢?发起一个pull request吧。

说一个以前遇到的“大数问题”,以前在大学的时候做acm的题。遇到这么一道题目:http://acm.hdu.edu.cn/showproblem.php?pid=1592 问题的解决思路还是很简单只要运行N次 Xn - (0.5* Xn + 0.5) = X(n-1)。但如果N足够大时,就会超过C语言的long 类型长度限制。解决方法是将数字转化为数组,从各位开始,比如a=123456789,表述为数组[6789,2345,1],然后对这种数据实现加减乘数的运算。ps:不转成字符串是出于性能考虑

如果是太大太大的数,只能是用 array 来模拟了大数了

目前这个模块可以解决大数的问题。只不过跟13楼思路一样,划分为数组。

let BigNumber = require('bignumber.js');
new BigNumber('8182931235402704882')  // => { [String: '8182931235402704882'] s: 1, e: 18, c: [ 81829, 31235402704882 ] }

to see : https://www.npmjs.com/package/bignumber.js

回到顶部