GitHub

JS数字类型那些坑

做数值计算时,注意JS数值类型的精度

    在 JS 里,所有的 number 原始值都是一个双精度浮点数,对应 Java 的 double 类型,对应标准 IEEE754。小心它的精度问题。因为它会造成0.1 + 0.2 = 0.30000000000000004 这样一个浮点数计算错误的问题。

做整数处理时,注意数值的大小

    可通过以下两个方法查看JS 最大可存储的安全整数(不存在精度问题)

Number.MAX_SAFE_INTEGER; //9007199254740991
Number.MIN_SAFE_INTEGER; //-9007199254740991

    问题通常出在前后端数据传输上。数据库中的主键通常是一个自增长的长整型数,有可能会超出 JS 的安全整数范围,这时请考虑使用字符串传输。

做小数计算时,注意浮点数精度问题

    对小数使用 toFixed 方法四舍五入时,注意 toFixed方法具有潜在的“诡异特性”即“四舍六入五成双”,且toFixed()方法返回的数据类型是字符串。如果你仅仅想用来去掉小数的后几位,慎用。参考

    对小数进行取整时,慎用parseInt()。parseInt() 主要用于将字符串转换成整数,所以哪怕目标本身就是一个数,也极有可能是先转换成字符串再来处理的。parseInt的用处在于转换一些CSS里带单位的值: parseInt('10px',10) => 10

解决方法

    ES6新扩展的方法:Math.trunc() 此方法是直接对数值进行取整处理,理论上来说会快一些也更准确一些,但要注意兼容性。

 用 ~~ 或者 |0 的方式也可以,而且这两个方法被相同作用的Math方法要快

  

var a = 5.6667;
~~ a; // 5
a |0; //5
//要注意这两个方法和Math方法的并不更改 a 本身

 

    推荐几个第三方库:

JS出现精度丢失的原因

    用一句话来概括就是,计算机中用二进制来存储小数,而大部分小数转成二进制之后都是无限循环的值,因此存在取舍问题,也就是精度丢失。不管是浮点数计算的计算结果错误和大整数的计算结果错误,最终都可以归结到JS的精度只有53位(尾数只能存储53位的有效数字)。

参考:

 

posted @ 2018-03-05 11:28  長风  阅读(248)  评论(0编辑  收藏  举报