有这么一道经典的面试题:
请说说为什么 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面板打印也确实是这么个结果。
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…