当前位置:嗨网首页>书籍在线阅读

09-数字

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.6 数字

有些数字(如3、5.5和1 000 000)可以用计算机精确地表示,而很多数字只能取近似值。比如,计算机不能将圆周率π完全表示出来,因为π的小数位是无限不循环的。其他一些数字,比如1/3,可以用特殊的技术来表示,但是由于它们的小数部分是无限重复的(3.33333……),所以通常会对它们取近似值。

JavaScript--跟大多数编程语言一样—有两种格式的近似值:IEEE-764双精度和浮点型(从现在开始更倾向于简单地使用“double”)。关于这种格式的详细介绍超出了本书的范围,但是除非要做复杂的数字分析,否则不需要完全搞懂它(译者注:适当的“不求甚解”有时候是为了更好地专注自己的事情上)。然而,按照这种格式取近似值,其结果通常会造成困惑。比如,JavaScript执行0.1+0.2的结果是0.30000000000000004。看到这个结果,不要以为JavaScript“崩溃”了或认为它不擅长算术,因为在有限的内存中给无限值取近似值,这是不可避免的结果。

JavaScript是一门与众不同的编程语言,它只有一种数值数据类型[1]。而大多数编程语言有多种整数类型和2种及以上的浮点型。这样做,一方面简化了JavaScript,尤其是针对初学者。另一方面,它也降低了JavaScript对那些对整数算法有性能要求,或者对固定精度的数字的精度有较高要求的应用的适应性。

JavaScript能识别4种类型的数字字面量:十进制数、二进制数、八进制数和十六进制数。十进制数可以用来表示整数(不含小数位)、十进制数,以及以10为底的指数(科学计数法的缩写,例如3.0e6)。此外,还有一些特殊值,比如,正负无穷大,以及NaN(从技术上讲,它们不是数字,但会返回数值,所以将它们归类在一起):

let count = 10;           // 即便赋的值是integer; 但count仍然是double类型
const blue = 0x0000ff;    // 十六进制数 (十六进制 ff 等于 十进制 255)
const umask = 0o0022;     // 八进制 (八进制22 等于 十进制 18)
const roomTemp = 21.5;    // 十进制
const c = 3.0e6;          // 指数(3.0 × 10^6 = 3,000,000)
const e = -1.6e-19;       // 指数(-1.6 × 10^-19 = 0.00000000000000000016)
const inf = Infinity;
const ninf = -Infinity;
const nan = NaN;          // "不是数字"
无论是用什么格式的字面量(十进制、十六进制、指数,等等),创建的数字都是以一种特定格式存储的:双精度。利用字面量的多种不同格式,可以按照任意格式来指定数字,但如果想以不同的格式展示数字,JavaScript就有点捉襟见肘了,这点会在第16章讨论。

绝大多数数学家可能认为上述观点是不恰当的:无穷大不是数字,事实上它的确不是;当然,NaN也不是。它们不能代替数字去做运算。但是,它们可以用作占位符。

此外,数字对应的Number对象还有很多实用的属性,这些属性代表着一些重要的数值。

const small = Number.EPSILON;             // 可以被添加到1从而获取一个比1大的
                                          // 不同数字,它的值近似于2.2e-16
const bigInt = Number.MAX_SAFE_INTEGER;   // 最大可表示的整数
const max = Number.MAX_VALUE;             // 最大可表示的数字
const minInt = Number.MIN_SAFE_INTEGER;   // 最小可表示的整数
const min = Number.MIN_VALUE;             // 最小可表示的数字
const nInf = Number.NEGATIVE_INFINITY;    // -Infinity
const nan= Number.NaN;                  // the same as Nan
const inf= Number.POSIT IVE_INFINITY;   // the same as Infinity

我们会在第16章讨论这些值的重要性。