JS中 0.1 + 0.2 为什么 !== 0.3?

2021-07-27  本文已影响0人  小生菜呢
计算计处理浮点数(小数)的精准度问题(前端 & 后端都一样)

计算计处理浮点数的都会存在精准度的问题,这不是浏览器也不是js独有的,这是计算机的问题

image.png

为什么会存在精准度问题呢?

浮点数以二进制存到计算机的时候,可能会出现无限循环的值,计算机最多只能截取64位(32位的电脑截取34位),本身就不是准确的,所以加了运算之后结果也不是准确的,而浏览器呢又会裁掉一部分,所以会出现浮点数运算的时候精准度丢失问题

但是项目中总会遇到浮点数运算,怎么保证精准度呢?
方法一:整体扩大系数

const coefficient = function coefficient(num){
  num  = num + '' 
  let  [, char = ''] = num.split('.'),
        len = char.length
  // 长度是几,就是10的几次幂,就是我们要扩大的系数
  // 比如长度是2,那就是10*10 = 100,参数要乘以100才能变成整数   
  // (如果整个计算完成后还是精度丢失,可以leng加1.加2...来保证准确性)    
  return  Math.pow(10, len + 1)       
  
}
const plus = function plus(n, m) {
  // 先把参数通过隐式转换转成数字
  n = +n
  m = +m
  if(isNaN(n) || isNaN(m)) return  // 不是数字,直接返回
  // 哪个参数的系数大,就取哪个
  let coeff = Math.max(coefficient(n),coefficient(m))
  return (n * coeff + m * coeff) / coeff

}
console.log(plus(0.1, 0.2))

方法二:第三方库:
Math.js
decimal.js
big.js....

方法三::toFixed()
最简单的方法,四舍五入,只保留小数点后两位

上一篇 下一篇

猜你喜欢

热点阅读