In JavaScript, Number is a numeric data type in the double-precision 64-bit floating point format (IEEE 754). In other programming languages different numeric types can exist, for examples: Integers, Floats, Doubles, or Bignums.
根据 MDN 关于 Number 的描述 可知,javascript 的数字类型只有 number 一种,使用 IEEE754 标准中的双精度浮点数来存储,长度为64位。
数据类型
基本数据类型:String,Boolean,Number,undefined,null,Symbol(ES6) 引用数据类型:Object,Functoin,Array,RegExp 等
堆(heap)和栈(stack)
栈
堆
内存中的其他空间:
关于 Number 数字类型
根据 MDN 关于 Number 的描述 可知,javascript 的数字类型只有
number
一种,使用IEEE754
标准中的双精度浮点数
来存储,长度为64位。问题:根据 IEEE754 计算 0.1 + 0.2 = ?
使用乘二取整法计算 0.1 的二进制表示形式
0.1 = (0.00011)2
0011 无限循环
= (-1)^0 2^(-4) (1.1001)21001 无限循环
0.2 = (-1)^0 2^(-3) (1.1001)2
1001 无限循环
故而 0.1 和 0.2 的浮点数存储形式表示为:
0.1 + 0.2
0.1 = (−1)^0 2^(−3) (0.11001100110011001100110011001100110011001100110011010)2
0.2 = (−1)^0 2^(−3) (1.1001100110011001100110011001100110011001100110011010)2
0.1 + 0.2 = (−1)^0 2^(−2) (1.0011001100110011001100110011001100110011001100110100)2 = 0.30000000000000004
解决方案
排除直接使用超大数或者超小数的情况,出现这种问题基本是浮点数的小数部分在转成二进制时丢失精度造成的,所以我们可以将小数部分转换成整数后再计算,需要注意的是乘法操作也是一种浮点数计算,在转换过程中可能存在精度问题。