Number对不起,我误会你了

338 阅读2分钟

有这么一道经典的面试题:

请说说为什么 0.1+0.2!==0.3 ?并给出解决方案?

条件反射答案如下:

  • 这是一个由进制转换造成精度丢失的问题。
  • 计算时要将数字转换成二进制,浮点数的二进制表示可能是无限循环的,IEEE754格式存储会截断位数,由此引发精度丢失问题。

可获得知识点:

  • Number类型,使用IEEE754格式存储
  • JavaScript 在数字运算前会将数字转成二进制

关于可获得知识点1【Number类型,使用IEEE754格式存储】,突然就和前几天工作中遇到的问题对上线了。

 需求描述如下:
 前后端传值x,约定类型为浮点数且保留2位小数,不能用字符串代替。

好家伙,之前都用toFixed保证小数位,这下要用Number转型了。

然而,

在使用Number转型时问题发生了:

Number('1.00')得到结果为数值1,存在小数位丢失问题。

想了一圈不知道为什么,联系上今天的知识点1,立马翻书查js高程4,原来是为了节省内存空间:

存储浮点值使用的内存空间,是整数值的两倍。
因此,如果数值本身为整数,小数点后仅跟着0,会自动转换成整数。

所以,跟Number没啥关系,只是字符串'1.00'转换成的数值恰好符合了浮点数数值为整数,小数点后仅跟0,会转换成整数】的情况。用console面板打印也确实是这么个结果。

image.png Number对不起,我误会你了。

那么,浮点值和整数值的内存空间又是怎么回事?

查到一篇文章---zhuanlan.zhihu.com/p/352723802

结合文末的总结,我的理解是:

js变量v,
如果赋值整数,v在栈中存的是整数值;
如果赋值浮点数或对象,v在栈中存的是指针,指针指向堆中的值。

文章-v8介绍中也说明了这一点----www.open-open.com/lib/view/op…

总结

查了一圈资料,也没啥特别的,就当作知识点记录一下吧。

在js存储中,浮点数占用内存空间是整数的两倍。
因此,如果浮点数数值为整数,小数点后仅跟0,会转换成整数。
js变量的数值存储分两种,整数在栈中存值,浮点数在栈中存指针,指针指向堆中的值。

其他

突然就好奇怎么查看js变量占用的内存,目前大概知道两个方向:

  • 可以借助devtools-memory下的快照查看
  • 直接使用Bolb对象 不过脱离了问题场景就没啥意义了,暂时先记录一下,后续有空查查看吧。

参考文章

从Chrome源码看JS Object的实现---zhuanlan.zhihu.com/p/26169639

Chrome开发者工具之JavaScript内存分析----www.open-open.com/lib/view/op…