Math.pow(2,53) //即9007199254740996
"9007199254740996".length //16
9007199254740993 // 9007199254740992
备注:
1. 2的53次方,并不是按数值长度设置的,
2. 总数量级为百万亿
3. 超出会显示,但是不正常(表现为max+1=max;输入16~21之间位数的9会直接往上+1等;)所以不能用于正常计算
4.21位会显示1e+21
安全值判断(ES6)Number.isSafeInteger(num):
Number.isSafeInteger(9007199254740993) // false (存在一个边界问题)
Number.isSafeInteger(990) // true
Number.isSafeInteger(9007199254740993 - 990) // true
9007199254740993 - 990
// 返回结果 9007199254740002
// 正确答案应该是 9007199254740003
9007199254700.3333 //9007199254700.334
"9007199254700.334".length //17(包含小数点)
.000001 //0.000001
.0000001 //1e-7
1.0000001 //1.0000001
9.0071992547409919 //9.007199254740993
备注:
1. 并不是两边都是2的53次方而是合在一起
2. 一起共16位,超出向上取整,
3. 如果小数位数超出,不一定是截断还是向上进,如上
3. 0.000001会显示1e-7,但前面带个整数就不会了
以上仅表示一些测试现象,留做注意和参考
JS里面尽管能够正确表示的数值量在2^53,但是位运算能够正常运算的范围却依然是32位,第一位为符号位,所以是2^31,转成10位的边界值是(2147483648)。
~~2147483647
2147483647
~~2147483648
-2147483648
~~2147483649
-2147483647
~~2147483650
-2147483646
备注:
1. JS的位移运算符有:(|,&,<<,>>,~,^) ,要特别注意使用时候的位数限制
2. 如上的按位取反运算可以看出,超出部分会变成负数往后减
一般处理方式都是转整以后运算,再除以100,例如:
const priceMultiply=(a,b)=>(a*b*100+.5|0)/100; //乘法
priceMultiply(18.12,10) //181.2 //后面不带0的数字
(18.12*10).toFixed(2) //181.20 //后面带0的字符串
NumberObject.toFixed(num)
所以写之前需要保证toFixed的对象是数字,否则会报错
//报错情况:
(null).toFixed(2)
(undefined).toFixed(2)
("222.333").toFixed(2)
//特殊:NaN是数字,但是无法取小数,也并不会报错
(NaN).toFixed(2) //"NaN"
理解javascript中浮点数计算不精准的原因,如何解决浮点数的四则运算(加减乘除)。js中除了toFixed方法以外的实现方法总汇
项目中用到浮点数,Int 等 js中 Number类型比较多, 加上牵涉到财务软件, 前台js运算等。 有时候会出现精确度的问题 , 公共方法中有好事者写的方法。 此处拿来借鉴。
JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。
今天在看基础js文章的时候发现了一个浮点数的精度问题,当打印小数相加的时候有时候会出现数值不准确的情况,如果是在做一些需要数据精度要求较高的工作的时候稍有不慎就会出现问题
实现简单,便于做加减乘除使用,由于项目临时要用记录下,如需要更加复杂的计算类库,可以考虑 math.js等知名类库;代码,使用方法如下
在 JavaScript 中整数和浮点数都属于number 数据类型,所有数字都是使用64位浮点数形式储存,遵循IEEE-754双精度标准存储,即便整数也是如此。 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!