如果你除了JavaScript外还有接触过其他的编程语言,那么你应该会发现在别的编程语言中,数值型的数据类型有好几种,例如Objective-C中的int,double, float,long等,而在JavaScript中就有一个特殊的点,它只有Number这一种数值型的数据类型。因为这一特殊性,Number也是ECMAScript中需要特别关注的一个数据类型了。
而一句话来概括JavaScript中的Number类型就是,这是由IEEE754格式来表示整数和浮点数值(双精度数值)。
双精度浮点数值能准确的表示高达53位精度的整数,从-2^53到2^53这个区间的所有整数都是有效的双精度浮点数,因此,尽管JavaScript中缺少明显的整数类型,但是依然可以进行整数运算。
所谓浮点数值,就是该树脂中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然个位数点前面可以没有整数,但是一般的编程过程中不推荐这种写法。
大多数的算术运算符都可以使用整数、实数或两者的组合进行计算。
0.1 * 0.19 // 0.19
-99 + 100; // 1
21-12.3; // 8.7
2.5 / 5; // 0.5
21 % 8; // 5
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样的,如果浮点数值本身表示的就是一个小数(1.0),那么该数值也会被转换为整数。
关于浮点数最后的警示是,我们应该时刻对它们保持警惕,浮点数看似跟其他语言的浮点数并无两样,但是它们是出了名的不精确。甚至一些看起来最简单的算术运算都会产生不正确的结果。
0.1 + 0.2; // 0.30000000000000004
这里使用的必须是这个经典的例子,也是被当做面试题问过无数遍的问题。尽管64位的精度已经相当高了,但是双精度浮点数也只能表示一组有限的数字,而不能表示所有的实数集。浮点运算只能产生近似的结果,四舍五入到最接近的可表示的实数。
关于浮点数会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家,其他使用相同数值格式的语言也存在这个问题。