JavaScript 数字

JavaScript 只有一种数值类型。它并不区分整型和浮点型,所有数值都是以浮点型数值来表示的。所以写数值时带不带小数点均可。


JavaScript 数值

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>写 JavaScript 数值既可以带小数点,也可以不带:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 3.14;
  9. var y = 3;
  10. document.getElementById("demo").innerHTML = x + "<br>" + y;
  11. </script>
  12. </body>
  13. </html>

超大或超小的数可通过科学计数法来写:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>超大或超小的数可通过科学(指数)计数法来写:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 123e5;
  9. var y = 123e-5;
  10. document.getElementById("demo").innerHTML = x + "<br>" + y;
  11. </script>
  12. </body>
  13. </html>

JavaScript 数值始终是 64 位的浮点数

与许多其他编程语言不同,JavaScript 不会定义不同类型的数,比如整数、短的、长的、浮点的等等。

JavaScript 数值始终以双精度浮点数来存储,根据国际 IEEE 754 标准。

此格式用 64 位存储数值,其中 0 到 51 存储数字(片段),52 到 62 存储指数,63 位存储符号:

值(aka Fraction/Mantissa)指数符号
52 bits(0 - 51)11 bits (52 - 62)1 bit (63)

精度

整数(不使用指数或科学计数法)会被精确到 15 位。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>整数(不使用指数或科学计数法)会被精确到 15 位:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 999999999999999;
  9. var y = 9999999999999999;
  10. document.getElementById("demo").innerHTML = x + "<br>" + y;
  11. </script>
  12. </body>
  13. </html>

小数的最大数是 17 位,但是浮点的算数并不总是 100% 精准:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>浮点的算数并不总是 100% 精准:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 0.2 + 0.1;
  9. document.getElementById("demo").innerHTML = "0.2 + 0.1 = " + x;
  10. </script>
  11. </body>
  12. </html>

可以间接使用乘除法有来解决上面的问题:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>浮点的算数并不总是 100% 精准:</p>
  6. <p id="demo1">
  7. <p>但是在使用乘法和除法是有用的:</p>
  8. <p id="demo2">
  9. <script>
  10. var x = 0.2 + 0.1;
  11. document.getElementById("demo1").innerHTML = "0.2 + 0.1 = " + x;
  12. var y = (0.2*10 + 0.1*10) / 10;
  13. document.getElementById("demo2").innerHTML = "0.2 + 0.1 = " + y;
  14. </script>
  15. </body>
  16. </html>

数字和字符串相加

注意:JavaScript 的加法和级联(concatenation)都使用 + 运算符。

数字用加法。字符串用级联。

如果您对两个数相加,结果将是一个数:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>如果您对两个数相加,结果将是一个数:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 10;
  9. var y = 20;
  10. var z = x + y;
  11. document.getElementById("demo").innerHTML = z;
  12. </script>
  13. </body>
  14. </html>

如果对两个字符串相加,结果将是一个字符串的级联:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>如果添加两个数字字符串,结果将是级联字符串:</p>
  6. <p id="demo">
  7. <script>
  8. var x = "10";
  9. var y = "20";
  10. var z = x + y;
  11. document.getElementById("demo").innerHTML = z;
  12. </script>
  13. </body>
  14. </html>

如果您对一个数和一个字符串相加,结果也是字符串级联:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>如果数字和数字字符串相加,结果将是级联字符串:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 10;
  9. var y = "20";
  10. var z = x + y;
  11. document.getElementById("demo").innerHTML = z;
  12. </script>
  13. </body>
  14. </html>

如果您对一个字符串和一个数字相加,结果也是字符串级联:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>如果数字字符串和数字相加,结果将是级联字符串:</p>
  6. <p id="demo">
  7. <script>
  8. var x = "10";
  9. var y = 20;
  10. document.getElementById("demo").innerHTML = "结果是:" + x + y;
  11. </script>
  12. </body>
  13. </html>

比如以下例子,认为结果应该是 30,但是由于是字符串加上数字,所以结果是级联字符串:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>比如以下例子,认为结果应该是 30,但是由于是字符串加上数字,所以结果是级联字符串:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 10;
  9. var y = 20;
  10. document.getElementById("demo").innerHTML = "结果是:" + x + y;
  11. </script>
  12. </body>
  13. </html>

再比如以下例子,是认为结果应该是 102030,但是 JavaScript 从左向右进行编译。 因为 x 和 y 都是数,10 + 20 将被相加。 因为 z 是字符串,30 + "30" 被级联。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>认为结果应该是 102030,但是 JavaScript 从左向右进行编译。 因为 x 和 y 都是数,10 + 20 将被相加。 因为 z 是字符串,30 + "30" 被级联:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 10;
  9. var y = 20;
  10. var z = "30";
  11. var result = x + y + z;
  12. document.getElementById("demo").innerHTML = result;
  13. </script>
  14. </body>
  15. </html>

数字字符串

JavaScript 字符串可以拥有数字内容,在所有数字运算中,JavaScript 会尝试将字符串转换为数字:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>在相除时,JavaScript 会尝试把字符串转换为数字:</p>
  6. <p id="demo">
  7. <script>
  8. var x = "100";
  9. var y = "10";
  10. var z = x / y;
  11. document.getElementById("demo").innerHTML = z;
  12. </script>
  13. </body>
  14. </html>

该例也将如此运行:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>在相乘时,JavaScript 会尝试把字符串转换为数字:</p>
  6. <p id="demo">
  7. <script>
  8. var x = "100";
  9. var y = "10";
  10. var z = x * y;
  11. document.getElementById("demo").innerHTML = z;
  12. </script>
  13. </body>
  14. </html>

但是,在相加时,JavaScript 不会把字符串转换为数字。因为 JavaScript 会用 + 运算符对字符串进行级联。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>在相加时,JavaScript 不会把字符串转换为数字:</p>
  6. <p id="demo">
  7. <script>
  8. var x = "100";
  9. var y = "10";
  10. var z = x + y;
  11. document.getElementById("demo").innerHTML = z;
  12. </script>
  13. </body>
  14. </html>

NaN - 非数值

NaN 属于 JavaScript 保留词,指示某个数不是合法数。

尝试用一个非数字字符串进行除法会得到 NaN(Not a Number):

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>用非数字字符串进行除法会得到 NaN(Not a Number):</p>
  6. <p id="demo">
  7. <script>
  8. document.getElementById("demo").innerHTML = 100 / "Apple";
  9. </script>
  10. </body>
  11. </html>

不过,假如字符串包含数值,则结果将是数:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>数字除以数字字符串将是数字:</p>
  6. <p id="demo">
  7. <script>
  8. document.getElementById("demo").innerHTML = 100 / "10";
  9. </script>
  10. </body>
  11. </html>

您可使用全局 JavaScript 函数 isNaN() 来确定某个值是否是数值:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>您可使用全局 JavaScript 函数 isNaN() 来确定某个值是否是数值:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 100 / "Apple";
  9. document.getElementById("demo").innerHTML = isNaN(x);
  10. </script>
  11. </body>
  12. </html>

注意: 假如您在数学运算中使用了 NaN,则结果也会是 NaN:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>假如您在数学运算中使用了 NaN,则结果也会是 NaN:</p>
  6. <p id="demo">
  7. <script>
  8. var x = NaN;
  9. var y = 5;
  10. document.getElementById("demo").innerHTML = x + y;
  11. </script>
  12. </body>
  13. </html>

结果也许是串连接:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>假如您在数学运算中使用了 NaN,则结果可能是级联:</p>
  6. <p id="demo">
  7. <script>
  8. var x = NaN;
  9. var y = "5";
  10. document.getElementById("demo").innerHTML = x + y;
  11. </script>
  12. </body>
  13. </html>

NaN 是数,typeof NaN 返回 number:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>NaN 是数,typeof NaN 返回 number:</p>
  6. <p id="demo">
  7. <script>
  8. var x = NaN;
  9. document.getElementById("demo").innerHTML = typeof x;
  10. </script>
  11. </body>
  12. </html>

Infinity

Infinity(或 -Infinity)是 JavaScript 在计算数时超出最大可能数范围时返回的值。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>Infinity (或 -Infinity)是 JavaScript 在计算数时超出最大可能数范围时返回的值:</p>
  6. <p id="demo">
  7. <script>
  8. var myNumber = 2;
  9. var txt = "";
  10. while (myNumber != Infinity) {
  11. myNumber = myNumber * myNumber;
  12. txt = txt + myNumber + "<br>";
  13. }
  14. document.getElementById("demo").innerHTML = txt;
  15. </script>
  16. </body>
  17. </html>

除以 0(零)也会生成 Infinity:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>除以 0(零)也会生成 Infinity:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 2/0;
  9. var y = -2/0;
  10. document.getElementById("demo").innerHTML = x + "<br>" + y;
  11. </script>
  12. </body>
  13. </html>

Infinity 是数:typeOf Infinity 返回 number。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>Infinity 是数字:</p>
  6. <p id="demo">
  7. <script>
  8. var x = Infinity;
  9. document.getElementById("demo").innerHTML = typeof x;
  10. </script>
  11. </body>
  12. </html>

十六进制

JavaScript 会把前缀为 0x 的数值常量解释为十六进制。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>前缀为 0x 的数值常量会被解释为十六进制:</p>
  6. <p id="demo">
  7. <script>
  8. var x = 0xFF;
  9. document.getElementById("demo").innerHTML = "0xFF = " + x;
  10. </script>
  11. </body>
  12. </html>

绝不要用前导零写数字(比如 07)。

一些 JavaScript 版本会把带有前导零的数解释为八进制。

默认地,Javascript 把数显示为十进制小数。

但是您能够使用 toString() 方法把数输出为十六进制、八进制或二进制。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>toString() 方法以基数 2 到 36 输出字符串:</p>
  6. <p id="demo">
  7. <script>
  8. var myNumber = 32;
  9. document.getElementById("demo").innerHTML =
  10. "32 = " + "<br>" +
  11. " Decimal " + myNumber.toString(10) + "<br>" +
  12. " Hexadecimal " + myNumber.toString(16) + "<br>" +
  13. " Octal " + myNumber.toString(8) + "<br>" +
  14. " Binary " + myNumber.toString(2);
  15. </script>
  16. </body>
  17. </html>

数值可以是对象

通常 JavaScript 数值是通过字面量创建的原始值:var x = 123

但是也可以通过关键词 new 定义为对象:var y = new Number(123)

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>数字可以是对象,但是没有必要把数字创建为对象。</p>
  6. <p id="demo">
  7. <script>
  8. var x = 123;
  9. var y = new Number(123);
  10. document.getElementById("demo").innerHTML = typeof x + "<br>" + typeof y;
  11. </script>
  12. </body>
  13. </html>

请不要创建数值对象。这样会拖慢执行速度。

new 关键词使代码复杂化,并产生某些无法预料的结果。

当使用 == 相等运算符时,相等的数看上去相等:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>绝对不要把数字创建为对象。</p>
  6. <p>数字和对象无法安全地比较。</p>
  7. <p id="demo">
  8. <script>
  9. var x = 500; // x 是数字
  10. var y = new Number(500); // y 是对象
  11. document.getElementById("demo").innerHTML = (x==y);
  12. </script>
  13. </body>
  14. </html>

当使用 === 相等运算符后,相等的数变为不相等,因为 === 运算符需要类型和值同时相等。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>绝对不要把数字创建为对象。</p>
  6. <p>数字和对象无法安全地比较。</p>
  7. <p id="demo">
  8. <script>
  9. var x = 500; // x 是数字
  10. var y = new Number(500); // y 是对象
  11. document.getElementById("demo").innerHTML = (x===y);
  12. </script>
  13. </body>
  14. </html>

JavaScript 对象之间也无法进行比较。

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 数字</h1>
  5. <p>绝对不要把数字创建为对象。</p>
  6. <p>数字和对象无法安全地比较。</p>
  7. <p id="demo">
  8. <script>
  9. var x = new Number(500); // x 是对象
  10. var y = new Number(500); // y 是对象
  11. document.getElementById("demo").innerHTML = (x==y);
  12. </script>
  13. </body>
  14. </html>