JavaScript中的Number

JavaScript中Number类型的存储



JavaScript中所有的数字,无论是整数还是小数,其类型都是 Number,遵循 IEEE 754 64位浮点数表示标准,程序底层统一使用64 位固定长度的二进制进行存储表示。对于JavaScript中一些边界值、特殊值在IEEE 754底层表示的了解,对于理解Number类型的操作有帮助。



IEEE754

IEEE754-64-双精度标准 使用1位符号位(Sign),11位指数位(Exponent),52位尾数位( Fraction),共64位对Number数据类型进行存储。还是引用Deng’s Blog:0.1+0.2=0.30000000000000004❓中的图:
在这里插入图片描述
其中

  • Fragtion位(也有叫Mantissa的):共52位,用于表示二进制的小数位。正常情况下数值在转化为二进制后,会以1.{0|1}+统一表示,Fragtion就是用来存储{0|1}+这一串二进制(比如1.75转化为统一的二进制为binary(1.11),其二进制小数位为binary(0.11),二进制为1100 00000000 00000000 00000000 00000000 00000000 00000000,后面共50个0)。其在首位省略了一位1,以表示更多的数值。但是其有几种特殊情况,比如0无法表示为1.{0|1}+的形式,这些特殊情况将取决于Exponent位。
  • Exponent位:共11位,Exponent值的范围为整数[0, 2047]。其中0与2047比较特殊,[1, 2046]表示正常指数(即默认Fragtion位前面有首位省略),1023表示指数为0,其他在正常情况下表示指数为(E-1023)。
  • Sign位:共1位。0表示正数,1表示负数。


JavaScript中Number的几个特殊取值

  • +0与-0: F与E全为0,±取决于Sign位。与数学逻辑一致的是,在js中(+0===-0)为true;只在极少地方使用时会有区别 。
  • +Infinite与-Infinite: 当F全为0,E全为1时取得,±取决于Sign位。可以将Infinite看成特别大的正常数字,+Infinite大于其他所有正常数字,-Infinite小于其他所有正常数字。
  • NaN: 当E全为1,F不为0时取得。需要注意的是,所有NaN都不等即NaN===NaN为false,NaN与任意值的比较好像都是false,!NaN为true。NaN出现的情况可以参考这篇博文

可以在这个网站进行Number与IEEE754 64位浮点数二进制的转换。



题外,JavaScript中新的基础数据类型BigInt

to be continued.