javascript中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。但数字运算结果超过了javascript中所能表示的数字上线(溢出),结果为一个特殊的无穷大的值(infinty)值,在javascript中以infinty表示。同样地,当负数的值超过了javascript所能表达的负数范围,结果为负无穷大,在javascript中以-Infinty表示。无穷大值的行为特性和我们所期望的是一致的:基于它们的加减乘除运算结果是无穷大(保留正负号)
下溢(underflow)是当运算结果无线接近于零并比 javascript能表示的最小值还小的时候发生的一种情形。当一个负数发生下溢时,javascript返回一个特殊的值,“负零”,这个(负零)几乎和正常的零完全一样。javascript程序员很少用到负零。
javascript预定义了全局变量Infinaty和NaN,用来表达正无穷大河非数字值,在ECMAScipt3中,这两个值是可以读写的。ECMAScript5修正了这个问题,将他们定义为只读的。ECMAScipt3中的Number对象定义的属性值也是只读的,这里有一些例子:
复制代码 代码如下:
Infinity //将一个可读/写的变量初始化为infinty
Number.POSITIVE_INFINITY //同样的值,只读
1 / 0 //这也是同样的值
Number.MAX_VALUE + 1 //计算结果还是Infinity
Number.NEGATIVE_INFINITY //表示了负无穷大
-Infinity
-1/0
-Number.MAX_VALUE -1
NaN //将一个可读/写的变量初始化为NaN
Number.NaN //同样的值,但是只读
0/0 //计算结果还是NaN
Number.MIN_VALUE/2 //发生下溢。计算结果为0
-Number.MIN_VALUE/2 //负零
-1/Infinity //负零
-0 //负零
javascript中的非数字值有一点特殊,它和人和值都不相等,包括自身。也就是说没法通过x==NaN来判断x是否为NaN。相反,应当使用x!=x来判断,当且仅当x为NaN的时候,表达式的结果为true.函数isNaN()作用与此相似,如果参数是NaN或者是一个非数字值(比如字符串和对象),则返回true。javascript中有一个类似的函数isFinite(),在参数不是NaN、Infinty或-Infinity的时候返回true.
负零值同样有些特殊,它和正负零是相等的(甚至使用javascript的严格相等测试来判断)、这意味这两个值几乎是一模一样的,除了作为除数之外:
复制代码 代码如下:
var zero = 0;
var negz = -0;
zero === negz //=>true 正负零值相等
1/zero === 1/negz //false 正无穷大和负无穷大不等
iiii.二进制浮点数和四舍五入错误
实数有无数个,但javascript通过浮点数的形式只能表示有限的个数(确切的说有18 437 736 874 454 810 627个),也就是说,当javascript中使用实数的时候,常常只是真实值的一个近似的表示。
javascript采用了IEEE-754浮点数表示法(几乎所有的现代编程语言采用)。这是一种二进制表示法,可以精确的表示分数,比如1/2 1/8 和1/1024,遗憾的是,我们常采用的分数,特别是金融计算方面,都是以十进制分数1/10 ,1/100等。二进制表示法并不能表示类似0.1这样简单的数字。
javascript中的数字具有足够的精度。并可以接近0.1.但事实上,数字不能精确表述带来了一些问题。
复制代码 代码如下: