1. JavaScript只有一种数值类型Number。(没有其它语言的short、int、long、float、double)
2. 书写数值时带不带小数点均可。
3. JavaScript数值始终是64位的浮点数
3.1. JavaScript数值始终以双精度浮点数来存储, 根据国际IEEE 754标准。
3.2. 此格式用64位存储数值, 其中0到51存储数字(片段), 52到62存储指数, 63位存储符号:
3.3. 整数类型的范围: 5e-324 ~ 1.7976931348623157e+308。
3.4. 值得注意的是, 对于整数的位运算(比如位移等操作), JavaScript仅支持32位整型数, 也即从-2147483648到+2147483647之间的整数。
4. 精度
4.1. 整数会被精确到15位:
var a = 999999999999999; // a是15位整数最大值, 能保证精度, 是999999999999999
var b = 9999999999999997; // b是16位整数, 不保证精度
var c = 9999999999999999; // c是16位整数, 不保证精度
// 15位的整数进行数学运行能够保证精准
var d = (((999999999999999 - 100000 - 1) / 2 - 9999) / 4 * 8 + 111999 + 8000) / 9 / 3 + 960900000000000;
4.2. 小数在进行数学运算的时候最大数是17位, 但是浮点的算数并不总是100%精准:
var e = 0.2 + 0.1; // 小数在进行数学运算的时候最大数是17位
var f = 0.3 - 0.2111; // 小数在进行数学运算的时候最大数是17位
var g = 0.001 + 1.1; // 并不总是17位小数
// 我们在对小说进行算数运算的时候, 通常对小说进行扩大10的几次方, 计算完成后, 再除以这个10的几次方
var h = (0.3 * 10000 - 0.2111 * 10000) / 10000;
5. 科学计数法
5.1. 超大或超小的数可通过科学计数法来写。
5.2. 大于等于le+21的数字会自动使用科学计数法输出。
5.3. 小于le+21的数字纵然我们用科学计数法表示, 但输出时也会是完整数字。
5.4. 默认把具有6个或6个以上前导0的浮点数转换成科学计数法。
var i = 9.99999999999999930000e20; // 小于le+21的数字纵然我们用科学计数法表示, 但输出时也会是完整数字。
var j = 9.99999999999999940000e20; // 发生了舍入, 大于le+21, 使用科学计数法输出
var k = 1e21; // 科学计数法
var l = 0.0000001; // 默认把具有6个或6个以上前导0的浮点数转换成科学计数法。
6. 数字字符串
6.1. JavaScript字符串可以拥有数字内容。
6.2. 在所有数字运算中, JavaScript会尝试将字符串转换为数字。
6.3. 实例
var m = '100' / '10'; // 结果是10
var n = '100' * '10'; // 结果是1000
var o = '100' - '10'; // 结果是90
7. NaN-非数值
7.1. NaN 属于 JavaScript 保留词,指示某个数不是合法数。
7.2. 尝试将一个字符串完整的转换成数字时, 如果转换失败, 就会得到NaN(Not a Number)。
7.3. isNaN()函数
7.3.1. 您可使用全局JavaScript函数isNaN()来确定某个值是否是非数字值。
7.3.2. 语法
isNaN(x)
7.3.3. 参数
7.3.4. 如果x是特殊的非数字值NaN(或者是被转换为这样的值), 返回的值就是true。如果x是其他值, 则返回false。
7.3.5. 如果把NaN与任何值(包括其自身)相比得到的结果均是false, 所以要判断某个值是否是NaN, 不能使用==或===运算符。正因为如此, isNaN()函数是必需的。
7.4. NaN是数值类型: typeOf NaN返回number。
7.5. 实例
var u = isNaN("111"); // 返回false
var v = isNaN("111a"); // 返回true
var w = isNaN(NaN); // 返回true, 因为NaN不是数
var x = typeof(NaN); // 返回number
8. 无穷数
8.1. Infinity(或-Infinity)是JavaScript在计算数时超出最大可能数范围时返回的值。
8.2. Infinity是数值类型: typeOf Infinity返回number。
8.3. isFinite()函数
8.3.1. 您可使用全局JavaScript函数isFinite()检查某个值是否为有穷大的数。
8.3.2. 语法
isFinite(number)
8.3.3. 参数
8.3.4. 如果number是有限数字或可转换为有限数字, 那么返回true。否则, 如果number是NaN(非数字)或者是正、负无穷大的数, 则返回false。
var y = isFinite(111); // 返回true
var z = isFinite("111"); // 返回true
var A = isFinite("111a"); // 返回false
var B = isFinite(Infinity); // 返回false, 因为Infinity是正无穷大
var C = isFinite(-Infinity); // 返回false, 因为-Infinity是负无穷大
var D = isFinite(NaN); // 返回false, 因为NaN非数字
var E = typeof(Infinity); // 返回number
var F = typeof(-Infinity); // 返回number
var G = isNaN(Infinity); // 返回false, 因为Infinity是正无穷数
var H = isNaN(-Infinity); // 返回false, 因为-Infinity是负无穷数
9. 数字和字符串相加
9.1. JavaScript的加法和级联(concatenation)都使用+运算符。数字用加法, 字符串用级联。
9.2. 如果对两个字符串相加,结果将是一个字符串的级联:
var x = "10";
var y = "20";
var z = x + y; // z 将是 1020(字符串)
9.3. 如果您对一个数和一个字符串相加, 结果也是字符串级联:
var x = 10;
var y = "20";
var z = x + y; // z 将是 1020(一个字符串)
9.4. 两个或多个数字算数运算, 并且在语句最左侧(JavaScript从左向右进行编译), 之后又和字符串级联, 这种情况会先进行算数运算再和字符串级联。
var x = 10;
var y = 20;
var z = "30";
var result = x + y + z; // 因为x和y都是数, 10+20将被相加。因为z是字符串, 30+"30"被级联。
10. 进制
10.1. 计算机中常见的进制是: 二进制、八进制、十进制和十六进制。
10.2. 八进制字面量的首数字必须是0, 其后的数字可以是任何八进制数字(0-7)。
var x = 011; // x将是9
10.3. 十六进制字面量以0x或0X前缀开头, 然后是任意的十六进制数字(0到9和A到F)。
var x = 0xFF; // x将是255
10.4. 默认地, Javascript把数显示为十进制数。
10.5. 尽管所有整数都可以表示为八进制或十六进制, 但所有数学运算返回的都是十进制结果。
11. 例子
11.1. 代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>JavaScript数字</title>
</head>
<body>
<script type="text/javascript">
var a = 999999999999999; // a是15位整数最大值, 能保证精度, 是999999999999999
var b = 9999999999999997; // b是16位整数, 不保证精度
var c = 9999999999999999; // c是16位整数, 不保证精度
// 15位的整数进行数学运行能够保证精准
var d = (((999999999999999 - 100000 - 1) / 2 - 9999) / 4 * 8 + 111999 + 8000) / 9 / 3 + 960900000000000;
var e = 0.2 + 0.1; // 小数在进行数学运算的时候最大数是17位
var f = 0.3 - 0.2111; // 小数在进行数学运算的时候最大数是17位
var g = 0.001 + 1.1; // 并不总是17位小数
// 我们在对小说进行算数运算的时候, 通常对小说进行扩大10的几次方, 计算完成后, 再除以这个10的几次方
var h = (0.3 * 10000 - 0.2111 * 10000) / 10000;
var i = 9.99999999999999930000e20; // 小于le+21的数字纵然我们用科学计数法表示, 但输出时也会是完整数字。
var j = 9.99999999999999940000e20; // 发生了舍入, 大于le+21, 使用科学计数法输出
var k = 1e21; // 科学计数法
var l = 0.0000001; // 默认把具有6个或6个以上前导0的浮点数转换成科学计数法。
// 在所有数字运算中, JavaScript会尝试将字符串转换为数字。
var m = "100" / "10"; // 结果是10
var n = "100" * "10"; // 结果是1000
var o = "100" - "10"; // 结果是90
var p = "10" + "20"; // 结果是1020
var q = 10 + "20"; // 结果是1020
var r = "10" + 20; // 结果是1020
var s = 10 + 20 + "30"; // 结果是3030
var t = 10 + "20" + 30; // 结果是102030
var u = isNaN("111"); // 返回false
var v = isNaN("111a"); // 返回true
var w = isNaN(NaN); // 返回true, 因为NaN不是数
var x = typeof(NaN); // 返回number
var y = isFinite(111); // 返回true
var z = isFinite("111"); // 返回true
var A = isFinite("111a"); // 返回false
var B = isFinite(Infinity); // 返回false, 因为Infinity是正无穷大
var C = isFinite(-Infinity); // 返回false, 因为-Infinity是负无穷大
var D = isFinite(NaN); // 返回false, 因为NaN非数字
var E = typeof(Infinity); // 返回number
var F = typeof(-Infinity); // 返回number
var G = isNaN(Infinity); // 返回false, 因为Infinity是正无穷数
var H = isNaN(-Infinity); // 返回false, 因为-Infinity是负无穷数
var I = 011; // 八进制数, E将是9
var J = 0xFF; // 十六进制数, F将是255
document.write('a = ' + a + '<br />');
document.write('b = ' + b + '<br />');
document.write('c = ' + c + '<br />');
document.write('d = ' + d + '<br />');
document.write('e = ' + e + '<br />');
document.write('f = ' + f + '<br />');
document.write('g = ' + g + '<br />');
document.write('h = ' + h + '<br />');
document.write('i = ' + i + '<br />');
document.write('j = ' + j + '<br />');
document.write('k = ' + k + '<br />');
document.write('l = ' + l + '<br />');
document.write('"100" / "10" = ' + m + '<br />');
document.write('"100" * "10" = ' + n + '<br />');
document.write('"100" - "10" = ' + o + '<br />');
document.write('"10" + "20" = ' + p + '<br />');
document.write('10 + "20" = ' + q + '<br />');
document.write('"10" + 20 = ' + r + '<br />');
document.write('10 + 20 + "30" = ' + s + '<br />');
document.write('10 + "20" + 30 = ' + t + '<br />');
document.write('isNaN("111") = ' + u + '<br />');
document.write('isNaN("111a") = ' + v + '<br />');
document.write('isNaN(NaN) = ' + w + '<br />');
document.write('typeof(NaN) = ' + x + '<br />');
document.write('isFinite(111) = ' + y + '<br />');
document.write('isFinite("111") = ' + z + '<br />');
document.write('isFinite("111a") = ' + A + '<br />');
document.write('isFinite(Infinity) = ' + B + '<br />');
document.write('isFinite(-Infinity) = ' + C + '<br />');
document.write('isFinite(NaN) = ' + D + '<br />');
document.write('typeof(Infinity) = ' + E + '<br />');
document.write('typeof(-Infinity) = ' + F + '<br />');
document.write('isNaN(Infinity) = ' + G + '<br />');
document.write('isNaN(-Infinity) = ' + H + '<br />');
document.write('I = ' + I + '<br />');
document.write('J = ' + J + '<br />');
</script>
</body>
</html>
11.2. 效果图