就决定是你了,js大牛出场吧~
发布于 10 年前 作者 CarlosRen 5579 次浏览 最后一次编辑是 8 年前

最近玩了玩chrome,感觉快被我玩坏了

var a = 12345678901234567890
undefined
a
12345678901234567000//卧槽??为何最后几位被舍了
================分割线君=========================
console.log(a.length)
undefined//为何输出不了长度呢 看看类型好了
undefined
================分割线君=========================
a
12345678901234567000
console.log(typeof a)
number VM695:2 .//还是数字。。。没被转成字符串
undefined
================分割线君=========================
var a = -12345678901234567890//加上符号试试~
undefined
a
-12345678901234567000//看来正数也是有一个符号位的
================分割线君=========================
var a=0.1234567890123456789//来个小数玩玩
undefined
a
0.12345678901234568 //小数点后17位 最后一位四舍五入了貌似
================分割线君=========================
================下面这块我就被玩坏了=========================
var a=0.12345678901234563
undefined
a
0.12345678901234564
------------------------------------------------------
var a=0.12345678901234565
undefined
a
0.12345678901234565
------------------------------------------------------
var a=0.12345678901234566
undefined
a
0.12345678901234566
------------------------------------------------------
var a=0.12345678901234567 //卧槽  67你怎么自己华丽丽的变身了????
undefined
a
0.12345678901234566
------------------------------------------------------
var a=0.12345678901234568
undefined
a
0.12345678901234568
------------------------------------------------------
var a=0.12345678901234569
undefined
a
0.12345678901234569
------------------------------------------------------
======================这还不是重点================================
var a =0.123456789012345661
undefined
a
0.12345678901234566 //舍了我表示可以接受
--------------------------------------------------
var a =0.123456789012345660
undefined
a
0.12345678901234566
--------------------------------------------------
var a =0.123456789012345670
undefined
a
0.12345678901234566 //卧槽??????
--------------------------------------------------
var a =0.123456789012345680
undefined
a
0.12345678901234568//卧槽
-------------------------------------------------
var a=-0.12345678901234567890123456789
undefined
a
-0.12345678901234568

等待各位大大解惑+填坑 先给我解释下这诡异的17个数字上线好嘛?为啥是17???15我都理解 还有啊。。。。 这特么 var a=0.12345678901234567 a 0.12345678901234566 //自己华丽丽的变身是啥情况啊????????

10 回复

首先,你得理解浮点数……

因为js中的所有数字都是double双精度数,双精度数不用科学表示的话,有效位数为53位(bit),最大可以表示18014398509481982,你的数字已经超出精度范围了。具体你可以看浮点小数的IEEE 754标准。

number的精度问题,最大应该是2^54,即正负2的53次方 这是由V8决定的,之前的贴子已经有人提过这问题

二进制的双精度浮点数 在小数, 大数的运算上只能是近似的(虽然有时候它看起来是对的) 你需要对js的number类型的实现有了解 0.8-0.6你试试就行了

chrome君在哭泣,被楼主玩死鸟:(

目前这个模块可以解决大数的问题。只不过跟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

@ravenwang测试数据,请不用理会

@ravenwang厉害,理解的很透彻

回到顶部