JavaScript Number.toString方法是否在阈值后丢失精度?相关代码疑问
JavaScript 浮点数精度问题解析
JavaScript的
Number类型本质是64位双精度浮点数,它能精确表示的整数范围仅到2^53(即9007199254740992),而10**23(100000000000000000000000)远超出这个范围,所以无法被精确存储,实际存储的是最接近它的可表示浮点数——也就是你将十六进制转回后得到的99999999999999991611392。第二个代码的结果符合预期:
- 执行
let x = 10**23时,x已经是那个近似值(控制台显示1e+23是简化输出,并非实际存储值); x.toString(16)输出的是该近似值的十六进制形式,再通过parseInt转回十进制,得到的还是同一个近似值;- 因此
x == parseInt(x.toString(16),16)比较的是同一个浮点数,结果为true。
- 执行
你的理解偏差在于:误以为10**23在JavaScript中是精确存储的,但实际上它从赋值那一刻起就已经是近似值了,转十六进制再转回的数值和原变量存储的是同一个值,所以比较不会返回false。
内容的提问来源于stack exchange,提问作者Parth Mall
相关产品推荐
相关产品推荐

