# js基本类型

# number

  • 按照规则,一个number类型的变量需要占据8byte,但是很多js引擎如v8引擎,为了极致优化,将小数字(2的32次方以下)设为sim,可以使用4byte就可以实现。
  • 8byte => 2的64次方 ,八个字节需要的内存。
  • 所以,通常的 存储浮点型值的内存空间是整数值的两倍 ,所以如果是1.00都会被转化成=>1;3.094000=>3.094;
  • 另外,js采用的双精度值,会出现舍入错误。

# toPrecision():把数字格式化为指定的长度,四舍五入

var num = new Number(7.123456); 
console.log(num.toPrecision());  // 输出:7.123456 
console.log(num.toPrecision(1)); // 输出:7
console.log(num.toPrecision(2)); // 输出:7.1

# toFixed()

保留多少位小数,也是四舍五入

var a=1.367
console.log(a.toFixed(2))//1.37

# toString():把数字转换为字符串,使用指定的基数。数字的基数是 2 ~ 36 之间的整数。若省略该参数,则使用基数 10。

var num = new Number(10); 
console.log(num.toString());  // 输出10进制:10
console.log(num.toString(2)); // 输出2进制:1010
console.log(num.toString(8)); // 输出8进制:12

# valueOf():返回一个 Number 对象的原始数字值。

var num = new Number(10); 
console.log(num.valueOf()); // 输出:10

# isNaN

判断是否是NaN

let a = 'true'
let b = true
let c='30'
console.log(isNaN(a))//true //不是数字字符串,不能转换
console.log(isNaN(b))//false //布尔值可以转换
console.log(isNaN(c))//false //是数字字符串,可以转换成数字

# js精度丢失问题解决

0.1+0.2=== 0.3 false 
1/3=0.3333...

可以有无限个3,但是计算机要存储,所以最后只能取近似值,当计算机存储后再取出就存在错误的可能。

对于整数,很容易转换成十进制或者二进制,而浮点数则不知道小数位数多少位,采取的是科学计数法。因为存储时有位数限制,某些十进制转二进制存在无限循环,二进制会采取舍入操作。

解决思路:转成整数

function add(num1, num2) {
 const num1Digits = (num1.toString().split('.')[1] || '').length;
 const num2Digits = (num2.toString().split('.')[1] || '').length;
 const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
 return (num1 * baseNum + num2 * baseNum) / baseNum;
}

console.log(add(0.1,0.2))
  • decimal.js
  • number-precision
  • long:它的思想是将 long 类型的值转化成两个 32 位的双精度类型的值。
  • bignumber.js:它的思想是转化成 string 进行处理,这种方式对性能有一定影响;
  • math.js

es6扩展的一些number的用法

最后更新: 4/17/2024, 12:46:53 PM