3-2 嚙複字

為保留最高的精確度,JavaScript 內部把所有的數值均表示成雙倍精準(Double Precision)浮點數,因此在 JavaScript 中的數值變數,無論看起來是整數和浮點數,其內部儲存和運算方式都是以雙倍精準的浮點數來進行。

Hint
在一般 32 位元的PC 上,一般浮點數都是佔用 4 bytes,但雙倍精準浮點數會佔用 8 bytes,以提升數值運算的精確度。我們一般常用的科學計算軟體 MATLAB,它的預設數值型態也是雙倍精準浮點數。

JavaScript 的整數大部分是以十進位來表示,但若有需要,也可以使用不同的基底(Base)來表示,例如 8(八進位)和 16(十六進位),說明如下:

Hint
八進位和十六進位的數字可以是負數,但是不能有小數部分,而且也不能以科學記號法(指數)來表示。

浮點數可用小數點來表示,或用科學記號法來表示。若用科學記號法,大寫或小寫的 "e" 都可以表示 「10的次方」。JavaScript 使用 IEEE 754 浮點標準的數值表示法來表示數字,您可以寫出大到像 1.7976931348623157x10308,和小到像 5.00x10-324 的數字。

以下是一些 JavaScript 數字的範例。

數字說明十進位表示法
.0001, 0.0001, 1e-4, 1.0e-44 個浮點數,值皆相等。0.0001
3.45e2一個浮點數。345
42一個整數。42
0378一個整數。雖然看起來像八進位數字(以0開頭),8 不是正確的數字,所以這個數字是十進位數字。378
0377一個八進位整數。注意它雖然只比上面的數字小1,它真正的值卻截然不同。255
0.0001一個浮點數字。即使以0開頭,它卻不是八進位數字,因為它有一個小數點。0.0001
00.0001這是一個錯誤。開頭的兩個0顯示它是個八進位數,可是八進位數字是不能有小數點的。(造成編譯器錯誤)
0Xff十六進位的整數。255
0x37CF十六進位的整數。14287
0x3e7十六進位的整數。注意 "e" 並不是指數。999
0x3.45e2這是一個錯誤。十六進位數字不能有小數部分。(造成編譯器錯誤)

此外,JavaScript 還有一些特殊數值如下︰

請見下列範例:

Example(number01.htm):

上述範例的原始檔如下:

原始檔(number01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>產生 JavaScript 的特殊數值</h2>
<hr>

<script>
document.write("0/0 = " + (0/0) + "<br>");
document.write("Math.pow(-1, 0.5) = " + Math.pow(-1, 0.5) + "<br>");
document.write("Math.pow(-1, 0.327) = " + Math.pow(-1, 0.327) + "<br>");
document.write("Math.log(0) = " + Math.log(0) + "<br>");
document.write("Math.pow(0, 0) = " + Math.pow(0, 0) + "<br>");
document.write("1/0 = " + (1/0) + "<br>");
document.write("-1/0 = " + (-1/0) + "<br>");
</script>

<hr>
</body>
</html>

Hint
為什麼「Math.pow(0, 0) = 1」?理論上應該是 NaN,但不知 JavaScript 為何產生 1,這可能是 JavaScript 內部的一個 bug。

Number 是一個內訂的物件,我們可以使用 Number 的相關屬性來代表與數字相關的常數,列表如下:

常數表示法說明
Number.MIN_VALUE傳回能在 JavaScript 中表示最接近零的數字。大約等於 5.00E-324。
Number.MAX_VALUE傳回能在 JavaScript 中表示的最大值。大約等於 1.79E+308。
Number.NEGATIVE_INFINITY傳回一個能在 JavaScript 中表示、且比最大負數 (-Number.MAX_VALUE) 還要小的值。
Number.POSITIVE_INFINITY傳回能在 JavaScript 中表示且大於最大數 (Number.MAX_VALUE) 的值。
Number.NaN一個特殊值,可指出算術運算式的傳回值不是一個數字。

此外,還有一些與數字相關的內建函式,列表說明如下:

函式格式說明
parseInt(numString, [radix])傳回一個從字串 numString 轉換而來的整數,其中 radix 是介於 2 和 36 之間的值,用來指出包含在 numString 中的數字基底(Base)。如果未提供,則字首為 0x 的字串會視為十六進位的數字,而字首為 0 的字串則會視為八進位的數字。其他所有的字串則會視為十進位的數字。
parseFloat(numString)傳回一個從字串 numString 轉換而來的浮點數。
isNaN(number)如果 number 值為 NaN,則 isNaN 函式會傳回 true,否則會傳回 false。通常使用此函式來測試 parseInt 和 parseFloat 方法的傳回值。
x.toString([radix])將數值 x 轉成特定基底 radix 的字串。
x.toFixed(n)將數值 x 轉成小數點以下 n 位有效數字的小數點表示法。
x.toExponential(n)將數值 x 轉成小數點以下 n 位有效數字的科學記號表示法。
x.toPrecision(n)將數值 x 轉成共具有 n 位有效數字。

我們可以使用 toString() 的方法來顯示基底的轉換結果,例如:

Example(number03.htm):

上述範例的原始檔如下:

原始檔(number03.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>不同基底的表示方式</h2>
<hr>

<table border=1 align=center>
<tr><th>十進位<th>二進位<th>八進位<th>十六進位
<script>
for (x=0; x<16; x++){
	document.writeln("<tr>");
	document.writeln("<td>"+x.toString());
	document.writeln("<td>"+x.toString(2));
	document.writeln("<td>"+x.toString(8));
	document.writeln("<td>"+x.toString(16));
}
</script>
</table>

<hr>
</body>
</html>

此外,我們可以使用下列範例,來對各種與數字物件相關的常數和函式進行簡單測試:

Example(number02.htm):

上述範例的原始檔如下:

原始檔(number02.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>與數字物件(Number)相關的常數與函式的測試</h2>
<hr>

<script>
x = "15.32";
document.writeln("parseInt(\""+x+"\") = " + parseInt(x) + "<br>");
x = "5e+3.42";
document.writeln("parseInt(\""+x+"\") = " + parseInt(x) + "<br>");
x = "15abc";
document.writeln("parseInt(\""+x+"\") = " + parseInt(x) + "<br>");
x = "abc";
document.writeln("parseInt(\""+x+"\") = " + parseInt(x) + "<br>");
</script>
<p>
<script>
x = "15.32";
document.writeln("parseFloat(\""+x+"\") = " + parseFloat(x) + "<br>");
x = "5.28e+3.42";
document.writeln("parseFloat(\""+x+"\") = " + parseFloat(x) + "<br>");
x = "15.32abc";
document.writeln("parseFloat(\""+x+"\") = " + parseFloat(x) + "<br>");
x = "abc";
document.writeln("parseFloat(\""+x+"\") = " + parseFloat(x) + "<br>");
</script>
<p>
<script>
document.writeln("The value returned by \"isNaN(Nan)\" is \"" + isNaN(NaN) + "\"<br>");
document.writeln("The value returned by \"NaN==NaN\" is \"" + (NaN==NaN) + "\"<br>");
</script>
<p>
<script>
document.writeln("Number.MIN_VALUE = " + Number.MIN_VALUE + "<br>");
document.writeln("Number.MAX_VALUE = " + Number.MAX_VALUE + "<br>");
document.writeln("Number.NEGATIVE_INFINITY = " + Number.NEGATIVE_INFINITY + "<br>");
document.writeln("Number.POSITIVE_INFINITY = " + Number.POSITIVE_INFINITY + "<br>");
document.writeln("Number.NaN = " + Number.NaN + "<br>");
</script>
<p>
<script>
x=5.238e+6;
document.writeln("x=" + x + ", x.toFixed(4)="+x.toFixed(4)+"<br>");
x=123456789;
document.writeln("x=" + x + ", x.toExponential(3)="+x.toExponential(3)+"<br>");
x=1234.56789;
document.writeln("x=" + x + ", x.toPrecision(5)="+x.toPrecision(5)+"<br>");
</script>

<hr>
</body>
</html>


JavaScript 程式設計與應用:用於網頁用戶端