js小数计算精度丢失问题

在前端对数字计算时,要尤其注意在小数计算时精度的问题

js中取整的几个方法:

(1)Math.round()

其取整时,会对小数进行四舍五入,但是其中有个小陷阱,对于Math.round(-1.5)// -1

Math.round()方法准确说是“四舍六入”,5要进行判断对待。

Math.round()的原理是对传入的参数+0.5之后,再向下取整得到的数就是返回的结果,返回值为long型。这里的向下取整是说取比它小的第一个整数或者和它相等的整数。

因此Math.round(-1.5)的结果是-1.5 + 0.5 再向下取整,即-1.0取整,结果是-1.

Math.round(-1.4)的结果是 -1.4 + 0.5 即-0.9 向下取整,结果是-1。

同理,Math.round(1.5)即为 1.5 + 0.5 再向下取整,结果是2。

(2)Math.ceil()

(3)Math.floor()

(4)Math.trunc()es6新增方法,会将小数部分去掉,只保留整数部分

(5)parseInt(string, radix)解析一个字符串并返回指定基数的十进制整数,radix是2~36之间的整数,表示被解析的基数。

第一个参数:要解析的字符串,如果传入的是数字,在转换前会先转化成字符串,如果转化不了,返回NaN,开头空白符会被忽略

第二个参数:基数,就是将要解析为多少进制的整数, 基数为0,默认为10进制

1.第二个参数为2~36的整数,如果超出这个范围,将会返回NaN

2.第二个参数指定为0或未指定,将根据字符串的值推算基数

估算的方式:

如果输入的 string 以 0x 或 0X(一个 0,后面是小写或大写的 X)开头,那么 radix 被假定为 16,字符串的其余部分被当做十六进制数去解析。
如果输入的 string 以 “0”(0)开头,radix 被假定为 8(八进制)或 10(十进制)。具体选择哪一个 radix 取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix。
如果输入的 string 以任何其他值开头,radix 是 10 (十进制)。

3.解析的字符串包含的数字超过基数,返回NaN

console.log(parseInt(‘4’, 3)) // NaN

4.小数点后超过7位,应注意此时会有容易忽略的陷阱,尤其对浮点数,用这些方法时,尤其要注意精度问题

console.log(parseInt(0.000000000007)) // 7, 原因是不是字符串,会先toString()转成字符串,而连续的超过6个0及以上的0会科学计数法显示

consol.log(0.000000000007.toString() ) //7e-12

总结:

第一个参数为字符串,如果是数字,会先使用toString解析成字符串,遇到解析不了的,将会返回NaN;

第二个参数,基数为0或未指定,将会根据第一个参数的格式,进行推断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值