JavaScript - 数値

数値

JavaScript では、整数と浮動小数点を区別せず、すべて浮動小数点で表します。

浮動小数点の最大値は ± 1.7976931348623157 × 10308 で、最小値は ± 5 × 10-324 となります。数値形式では、-9007199254740991 (-253-1) ~ 9007199254740991 (253-1) までの整数は正確に表せます。

console.log(Number.MAX_VALUE);        //  1.7976931348623157e+308
console.log(Number.MIN_VALUE);        //  5e-324
console.log(Number.MIN_SAFE_INTEGER); //  9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
整数リテラルを格納する例

上記範囲外の整数を扱う場合は精度が損なわれます。このようなプログラム内の数字を 数値リテラル と呼びます。数値リテラルには、整数リテラル浮動小数点リテラル があります。

整数リテラル

整数リテラルは 10 進数を指定します。リテラルの先頭に 0x または 0X を付けると 16 進数を指定できます。リテラルの先頭に 0 を付けると 8 進数の指定になりますが、strict モード や JavaScript の処理系によってサポートされていない場合があるため非推奨となります。

// 10 進数の整数リテラルを格納
var num10 = 123;

// 16 進数の整数リテラルを格納
var num16 = 0xff;

//  8 進数の整数リテラルを格納(非推奨)
var num8 = 0123;
整数リテラルを格納する例

浮動小数点リテラル

浮動小数点リテラルでは小数部や指数も使用できます。

// 小数の浮動小数点リテラルを格納
var decimal = 123.456;

// 指数の浮動小数点リテラルを格納
var light = 2.99792458e8; // 2.99792458 × 108
浮動小数点リテラルを格納する例

算術演算

JavaScript の算術演算子は 加算、減算、乗算、除算、余剰、指数があります。これらの基本的な算術演算子以外にも、数学的な定数と関数を提供する Math オブジェクトが組み込まれています。

// プロパティ
Math.E            // ネイピア数			実行結果:2.718281828459045
Math.LN2          // 2 の自然対数		実行結果:0.6931471805599453
Math.LN10         // 10の自然対数		実行結果:2.302585092994046
Math.LOG2E        // 2 を底とした E の対数	実行結果:1.4426950408889634
Math.LOG10E       // 10を底とした E の対数	実行結果:0.4342944819032518
Math.PI           // 円周率			実行結果:3.141592653589793
Math.SQRT1_2      // 1/2 の平方根		実行結果:0.7071067811865476
Math.SQRT2        // 2 の平方根			実行結果:0.7071067811865476

// メソッド
Math.abs(-123)    // 絶対値			実行結果:123
Math.acos(0.5)    // 逆余弦			実行結果:1.0471975511965979
Math.asin(0.5)    // 逆正弦			実行結果:0.5235987755982989
Math.atan(0.5)    // 逆正接			実行結果:0.4636476090008061
Math.atan2(45,90) // 比率での逆正接		実行結果:0.4636476090008061
Math.ceil(0.5)    // 整数に切り上げ		実行結果:1
Math.cos(0.5)     // 余弦			実行結果:0.8775825618903728
Math.exp(2)       // ネイピア数のべき乗		実行結果:7.38905609893065
Math.floor(0.5)   // 整数に切り下げ		実行結果:0
Math.log(2)       // 自然対数(底はe)		実行結果:0.6931471805599453
Math.max(1,0,-1)  // 最大の数			実行結果:1
Math.min(1,0,-1)  // 最小の数			実行結果:-1
Math.pow(2,3)     // 23			実行結果:8
Math.random()     // 0以上1未満の擬似乱数	実行結果:0.053823984980832185
Math.sin(0.5)     // 正弦			実行結果:0.479425538604203
Math.sqrt(2)      // 平方根			実行結果:1.4142135623730951
Math.tan(0.5)     // 正接			実行結果:0.5463024898437905
Math オブジェクト

浮動小数点の限界値

JavaScript ではオーバーフローやアンダーフローが発生した場合や、0 除算を行ってもエラーが発生しません。JavaScript では無限大を表現する Infinity や、負数の 0 を表す -0 や、数値に変換できない NaN (Not a Number) の特殊なグローバル変数が定義されているためです。

Infinity は、絶対値で表現可能な最大値を超えるオーバーフローが発生した場合に出力されます。Infinity は、加算、減算、乗算、除算を行っても変化しませんが、正の無限大と負の無限大があります。正の無限大と負の無限大を比較した場合、異なる値と判定されます。

-0 は負の値に対して絶対値で表現可能な最小値を超えるアンダーフローが発生した場合に出力されます。正の値に対するアンダーフローが発生した場合は、通常の 0 を返します。しかし、-00 を比較した場合、等しいと判定されるためプログラミングで意識する必要はありません。

NaN は 0 を 0 で除算した場合や、無限大を無限大で除算した場合や、負数の平方根を求めた場合に出力されます。その他、数値に変換できない算術演算を行った場合も NaN が出力されます。NaN は特殊な値であり、どの値と比較しても等しいと判定されません。NaNNaN を比較しても等しいと判定されないため、注意が必要です。NaN であるか判定するためには、isNaN() 関数や isFinite() 関数を使用します。

isNaN(NaN);                   // true
isNaN(undefined);             // true
isNaN({});                    // true
isNaN(true);                  // false
isNaN(null);                  // false
isNaN(37);                    // false
isNaN("37");                  // false
isNaN("37.37");               // false
isNaN("37,5");                // true
isNaN('123ABC');              // true
isNaN("");                    // false
isNaN(" ");                   // false
isNaN(new Date());            // false
isNaN(new Date().toString()); // true
isNaN("blabla")               // true

isFinite(Infinity);           // false
isFinite(-Infinity);          // false
isFinite(NaN);                // false
isFinite(0);                  // true
isFinite(2e64);               // true
isFinite(910);                // true
isFinite(null);               // true
isFinite("0");                // true
isNaN() 関数 / isFinite() 関数

浮動小数点の丸め誤差

プログラミング言語で使われている IEEE 754 浮動小数点表現形式は、2 進数表記であるため 10 進数を正確に表現できない場合があります。JavaScript でも近似表現となるため、丸め誤差の問題が発生します。

var x = 0.3 - 0.2;
var y = 0.2 - 0.1;

x==y;   // false
x==0.1; // false
y==0.1; // true
丸め誤差が発生するケース

丸め誤差のために 0.3 と 0.2 の差分の近似表現と 0.2 と 0.1 の差分の近似表現は正確には同じ値になりません。x と y の値はほぼ同じで、両方とも正しい値に非常に近い値になっています。そのため、等しいかどうかを比較しようとしたときに問題が生じます。

関連記事

JavaScript のまとめページはプログラミング JavaScript 入門を参照してください。

Category:
プログラミング
公開日:
更新日:
Pageviews:
74
Shares:
1
Tag:
JavaScript
hatebu icon
hatebu