JavaScript | 基礎構文:データ型 – Number

JavaScript
スポンサーリンク

JavaScript の Number を一言でいうと

JavaScript の Number
「整数も小数もぜんぶまとめて扱う “数字用の型”」です。

他の言語だと「int」「float」「double」など数字の型が分かれていることが多いですが、
JavaScript では「とりあえず全部 Number」です。

ここが重要です。
JavaScript の数字は
整数も小数も Number 型ひとつで表現する
というルールになっています。
この前提を押さえてから細かい話に入ると、理解がかなりラクになります。


Number の基本:整数も小数も同じ型

Number 型の変数の宣言は、普通に数を書くだけです。

let age = 20;        // 整数
let price = 1200.5;  // 小数
JavaScript

typeof で型を確認すると、どちらも number になります。

console.log(typeof age);   // "number"
console.log(typeof price); // "number"
JavaScript

整数だから特別な型、ということはありません。
-503.14-10.8 のような負の数や小数も、全部 number です。

ここが重要です。
「整数か小数か」を意識するのではなく、「これは数か、それ以外か」だけに集中すればいい、
というのが JavaScript のシンプルなところです。


Number でできる基本的な計算

足し算、引き算、掛け算、割り算、剰余(余り)など、
基本的な算数はほぼそのままの記号で書けます。

let a = 10;
let b = 3;

console.log(a + b);  // 13(足し算)
console.log(a - b);  // 7  (引き算)
console.log(a * b);  // 30(掛け算)
console.log(a / b);  // 3.3333333333333335(割り算)
console.log(a % b);  // 1  (余り)
JavaScript

割り算は小数になります。
JavaScript には「整数同士の割り算だから小数は切り捨て」みたいな自動ルールはありません。

必要なら自分で丸めます。

let result = 10 / 3;
console.log(Math.floor(result)); // 3(小数点以下切り捨て)
console.log(Math.round(result)); // 3(四捨五入)
console.log(Math.ceil(result));  // 4(切り上げ)
JavaScript

ここが重要です。
割り算の結果は基本的に小数になる
整数にしたいときは Math.floorMath.round などで自分で調整する
という感覚を持っておくと混乱が減ります。


Number 特有の値:NaN と Infinity

NaN(Not a Number)とは

NaN は「数値型(number)だけど、まともな数ではない」という特別な値です。

例えば、明らかにおかしな計算をすると出てきます。

let result = 0 / 0;
console.log(result); // NaN
console.log(typeof result); // "number"
JavaScript

typeofnumber を返していますが、
中身は「数ではない(Not a Number)」という状態です。

もう一つ例です。

let x = "abc" * 10;
console.log(x); // NaN
JavaScript

文字列 "abc" を数として計算しようとして失敗しているので、NaN になります。

ここが重要です。
NaN は
「計算の結果が数字として成り立たなかった」
ことを表すための、number 型の特殊な値です。
NaN になってしまったら、その前のどこかで「変な計算をしている」と考えるべきサインです。

NaN は自分自身と等しくない

ややこしいですが、NaN は自分自身とも等しくありません。

console.log(NaN === NaN); // false
JavaScript

「えっ?」と思うかもしれませんが、
「どんな NaN も、正確に同じ NaN とは限らない」という考え方からこうなっています。

NaN かどうかをチェックしたいときは、Number.isNaN を使います。

let value = 0 / 0;

console.log(Number.isNaN(value)); // true
JavaScript

Infinity(無限大)と -Infinity

0 で割ろうとすると、言語によってはエラーになりますが、
JavaScript では Infinity-Infinity になります。

console.log(10 / 0);  // Infinity
console.log(-10 / 0); // -Infinity
console.log(typeof (10 / 0)); // "number"
JavaScript

これも number 型です。

「極端に大きい/小さい結果」になる計算をすると Infinity-Infinity が出ることがあります。
数値計算をしていて結果が Infinity になったら、桁数が大きすぎるなど問題があるかも、と疑ってください。


小数(浮動小数点数)の罠:0.1 + 0.2 が 0.3 にならない理由

JavaScript(というより多くのプログラミング言語)では、
小数は「2進数での近似値」として内部で表現されています。

このせいで、よく有名な現象が起きます。

console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
JavaScript

人間的には「0.1 + 0.2 = 0.3」です。
ですが、コンピュータ内部では「0.1 も 0.2 もほんの少しズレた値」でしか表現できず、
足した結果が「0.3 ぴったり」にはなってくれません。

ここが重要です。
JavaScript の Number は「浮動小数点数」という表現を使っているので
小数の計算結果は「ほんのわずかにズレる」ことがある
という点を必ず頭の片隅に置いておいてください。

たとえばお金の計算など、
「絶対に桁ズレしてほしくない」場面では、

整数(1円単位)で持っておいて必要なときだけ割る
小数を使う範囲をできるだけ短くする

といった工夫をすることが多いです。


文字列との相互変換:数字に変えたい/文字列にしたい

文字列 → 数字(Number に変換)

ユーザー入力や HTML の input から取ってきた値は、
基本的に「文字列」として扱われます。

let input = "123";
console.log(typeof input); // "string"
JavaScript

これを数字として扱いたいときは、NumberparseIntparseFloat などで変換します。

let input = "123";

let n1 = Number(input);       // 123(number)
let n2 = parseInt(input, 10); // 123(10進数として解釈)

console.log(n1 + 1); // 124
JavaScript

数字っぽい文字列でないときは NaN になります。

console.log(Number("abc")); // NaN
JavaScript

数字 → 文字列

逆に、数字を文字列として扱いたい場合は StringtoString を使います。

let age = 20;

let s1 = String(age);      // "20"
let s2 = age.toString();   // "20"

console.log(typeof s1); // "string"
JavaScript

文字列にしておけば、文章との連結が自然にできます。

let price = 1200;
console.log("値段は " + price + " 円です");
JavaScript

数値判定に使えるメソッドたち(軽く紹介)

初心者のうちはざっくり「こういうのがある」と知っておく程度で十分です。

Number.isNaN(value)
値が NaN かどうかを判定する。

Number.isFinite(value)
有限の数(Infinity や NaN ではない普通の数)かどうか。

Number.isInteger(value)
整数かどうかを判定する。

例として:

console.log(Number.isNaN(0 / 0));         // true
console.log(Number.isFinite(10 / 0));     // false(Infinity)
console.log(Number.isInteger(10));        // true
console.log(Number.isInteger(3.14));      // false
JavaScript

ここが重要です。
エラーが出ないまま NaN や Infinity が紛れ込むのが一番怖いので、
「怪しいな」と思った計算結果には
Number.isNaNNumber.isFinite を当ててみるのが良い習慣です。


BigInt との違いをちらっとだけ

最近の JavaScript には、BigInt という「超大きな整数」を扱う型もあります。

let big = 9007199254740991n; // 最後の n が BigInt の印
JavaScript

ですが、初心者のうちは
「普通の数字は全部 Number
超巨大な整数が必要になったら BigInt もある」
くらいの理解で十分です。

NumberBigInt はそのまま足し算したりできません。
混ぜて使うのは少し注意が必要なので、必要になったときに改めて学べば OK です。


初心者向け Number の押さえどころ

最後に、Number 型について本当に大事なポイントだけ整理します。

JavaScript の数字は、整数も小数も全部 Number 型ひとつで扱う。

+ - * / % で基本的な計算ができる。割り算は小数になるので、整数にしたいときは Math.floor などで丸める。

NaN は「数値計算に失敗したときの特別な number」。Number.isNaN でチェックできる。

Infinity / -Infinity は「極端に大きな値」や「0で割ったとき」などに現れる特殊な number。

小数の計算は、0.1 + 0.2 が 0.3 にならないような「誤差」が出ることがあるので、お金などの扱いには注意が必要。

文字列との変換には Number() / parseInt() / parseFloat()String() / toString() を使う。

ここが重要です。
「これは数か?」「これは数として扱って大丈夫か?」
という視点で、NumberNaNInfinity の存在を意識できるようになると、
「なんか計算結果がおかしい」「なんか NaN が出る」といったモヤモヤの原因が、自分で追えるようになっていきます。

もしよければ、次のような小さな練習をしてみてください。

let a = "10"; let b = "20"; という 2 つの文字列から

  1. 文字列のまま a + b をした結果
  2. 数字に変換してから a + b をした結果

を比べてみる。

そこから
「JavaScript は文字列と数値をどう扱い分けているのか」
を体感してみると、Number 型のイメージがかなりクリアになってくるはずです。

タイトルとURLをコピーしました