JavaScript 数字类型

114 阅读1分钟

十进制转换为二进制的计算 n.toString(2)

64位二进制值来表示一个数字

babbage.cs.qc.cuny.edu/IEEE-754.ol…

  • 第0位:符号位,0表示正数,1表示负数 S

  • 第1位到第11位「11位指数」:储存指数部分 E

  • 第12位到第63位「52位尾数」:储存小数部分(即有效数字)F

  • 注:尾数部分在规约形式下第一位默认为1(省略不写)

最大安全数字「16位」

Number.MAX_SAFE_INTEGER === Math.pow(2,53)-1

怎么解决精度问题

  • 将数字转成整数「扩大系数」

  • 三方库:Math.js 、decimal.js、big.js ...

JS中有关于小数(浮点数)的计算会出现精准度丢失的问题(0.1+0.2不等于0.3)

  • JS中所有值都是以2进制在计算机底层进行存储的

  • 浮点数转为二进制,可能出现无限循环的情况}

  • 在计算机底层存储的时候,最多存储64位「舍弃了一些值,值本身就失去了精准度」

function numbersequal(a, b) {
  return Math.abs(a - b) < Number.EPSILON
}
let a = 0.1 + 0.2,
  b = 0.3
console.log(numbersequal(a, b)) //true

浮点数计算的解决方案

  • toFixed(四舍五入)保留小数点后面N位,再用 + 将字符串转换成数字

  • 扩大系数法

const coefficient = function coefficient(num) {
  num = num + ''
  let [, char = ''] = num.split('.'),
    len = char.length
  return Math.pow(10, len) //-> 10**len
}
const plus = function plus(num1, num2) {
  // 先转化成数字
  num1 = +num1
  num2 = +num2
  if (isNaN(num1) || isNaN(num2)) return NaN
  let max = Math.max(coefficient(num1), coefficient(num2))
  return (num1 * max + num2 * max) / max
}
console.log(plus(0.1, 0.2))