糟粕
- NaN 不等于自身
- Math 对象有一些本该在Number 上的函数, 从Java学的糟粕
// 2147483647
浮点数的思想
- 分两部分: 有效位数(也叫系数-coefficient/分数fraction/尾数mantissa); 指数(exponent)指小数点应该放在哪个位置
- 64位(1一个number类型包含一个符号位(sign),11位指数位和53位有效数位)
- IEEE754 0.5 <= 有效位数 < 1.0 符号数(正/负) * 有效位数 * (2 ** 指数 )
2.1 零
Object.is(0, -0) // false 永远不要使用Object.is???
2.2 字面量
js 内置 18 437 736 874 454 810 627 (20位)个不可变的number 对象??
NaN === NaN // false
Object.is(NaN, NaN) // true
NaN 是 not a number的缩写但 typeof NaN // number
2.3 Number
Number.isNaN() //
Number.MAX_SAFE_INTEGER // 9007199254740991 16位, js 安全的计算范围, 超过16位还是用字符串吧...9000万亿.
Number.isSafeInteger(9007199254740991) // true 是否是安全整数
Number.MIN_VALUE
Number.MAX_VALUE
2.4 运算符
+ - * / % **
+ - 可以做前置运算符,+可以转数字,但是还是直接用Number(x) // 这样比较直观
+ 还可以拼接字符串,`${ a }${ b }`
2.5 位运算符
- 和C语言类似, js会先转换成32位有符号整型并开始计算, 得到结果再转回数值类型
- 最高22位的有效数字会直接丢失
&
|
^
<<
>>>
>> 带符号扩展右位移
2.6 Math对象
该对象有一些本应该是运算符的函数?
Math.floor()
Math.trunc() // 返回的是更接近0的整数
Math.min(1,2,3,0, -2) // -2
2.7 deconstruct函数分析数值类型的本质
function deconstruct(number) {let sign = 1;let coefficient = number;let exponent = 0;if (coefficient < 0) {coefficient = -coefficient;sign = -1}if (Number.isFinite(number) && number !== 0) {exponent = -1128 // -1128是Number.MIN_VALUE的指数减去有效位数再减去奖励位let reduction = coefficientwhile (reduction !== 0) {exponent++reduction /= 2}reduction = exponentwhile (reduction > 0) {coefficient /= 2reduction--}while (reduction < 0) {coefficient *= 2reduction++}}return {sign,coefficient, // 系数exponent, // 指数number}
}
console.log(deconstruct(Number.MAX_SAFE_INTEGER))
console.log(deconstruct(1))
console.log(deconstruct(0.1))
0.3
0.1 + 0.2 // 0.30000000000000004
100/3 // 33.333333333333336
两个大小差不多的数相加通常比两个大小悬殊的数相加产生较小的误差, 这就是为什么部分求和比单独求和更精确.