今天在团队里,又遇到的大Number的讨论。想起去年FaWave 在处理网易微博id的时候同样遇到过这个问题,先抛出一个js的库,大家从这里开始,发表下你的经历吧。
15 回复
- 我们前段时间在开发中还遇到过这个问题,由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次方
说一个以前遇到的“大数问题”,以前在大学的时候做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:不转成字符串是出于性能考虑