引言
JavaScript不区分整数值和浮点数值,全部使用浮点数值表示。当一个数字直接出现在JavaScript程序中,我们称之为数字直接量(numeric litertal)。JavaScript支持多种格式的数字直接量。
整型直接量
在JavaScript程序中,用一个程序序列表示一个十进制整数。除了十进制的整型直接量,JavaScript同样能识别十六进制(以16为基数)值(以“0x”和“0X”为前缀)。
浮点型直接量
浮点型直接量可以含有小数点,它们采用的是传统的实数写法。一个实数由整数部分、小数点和小数部分组成。同时支持指数记数法表示浮点型直接量。
JavaScript中的算术运算
JavaScript程序是使用语言本身提供的算术运算符来进行数字运算的。这些运算符包括加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)和求余(求整除后的余数)运算符(%)。JavaScrip中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。
溢出
当数字运算结果超过了JavaScript所能表示的数字上限(溢出),结果为一个特殊的无穷大(infinity)值,在JavaScript中以Infinity表示。同样,当负数的值超过了JavaScript所能表示的负数范围,结果为负无穷大,JavaScript中以-Infinity表示。无穷大值的行为特性和我们所期望的是一致的:基于它们的加、减、乘和除运算结果还是无穷大值(保留其正负号)。
下溢
下溢是当运算结果无限接近于零并比JavaScript能表示的最小值还小的时候发生的一种情形。这种情况下,JavaScript将会返回0。当一个负数发生下溢时,JavaScript返回一个特殊的值“负零”。这个值(负零)几乎和正常的完全一样,但是很少用到。
被零整除
被零整除在JavaScript并不报错:它只是简单的返回无穷大(Infinity)或负无穷大(-Infinity)。但是有一个例外,零除以零是没有意义的,这种整除运算结果也是一个非数字(not-a-number)值,用NaN表示。无穷大除以无穷大、给任意负数作开方运算或者算术运算符与不是数字或无法转换为数字的操作数一起使用时都将会返回NaN。
Infinity和NaN
JavaScript预定义了全局变量Infinity和NaN,用来表示正无穷大和非数字值。在ECMScript3中,这两个值是可读/写的,并可修改。ECMAScript5修正了这个错误,将它们定义为只读的。
特殊情况
- JavaScript中的非数字值都有一点特殊:它和任何值都不相等,包括自身。如判断变量x是否是NaN,应当使用x!=x来判断,当且仅当x为NaN的时候,表达式的结果才为true。
- 负零值同样有些特殊,它和正零值是相等的。这意味这两个值几乎一模一样的,除了作为除数之外:零被除得到正无穷大,负零被除得到负无穷大。
二进制浮点数和四舍五入错误
实数有无数个,但是JavaScript通过浮点数的形式只能表示其中有限的个数(确切地说是1843 7736 8744 5481 0627个)。也就是说,当在JavaScript中使用实数的时候,常常只是真实值的一个近似表示。