# 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