数値は文字列のように「’」「”」で囲わない。囲ってしまうと数値ではなく文字列として扱われてしまい、計算はできなくなります。
JavaScriptスクリプトの数値
数値として10進数、8進数、16進数、浮動小数点、指数表現等を使用できます。
小数
JavaScriptの数字は浮動小数点数というもので表現されているらしいです。難しい話はググってもらうとして、要するに、小数は誤差がでる仕様ということらしいです。
0.1と書くと、コンピュータ(内部は2進数)はそれを2進数に変換して……0.1000000000000000055…以下無限に続くらしいのを50桁くらいで丸めた近似値を受け取り処理をするのです。1÷3を小数で表現したみたいなことになってるのでしょう。
0.1+0.2は、結果を表示させると0.3ですが、実際は0.30000000000000004 なので、0.1+0.2===0.3の判定はfalseになってしまいます。えええー。誤差があるのでイコール0.3ではないのです。なんて罠だ。
小数を等しいかどうか比較してはいけないとだけは頭に叩き込みましょう。ウッカリ条件式書いてしまいそうです。
計算式や条件式に小数が混ざってないか、とくに変数の中身が小数である可能性はないのか、誤差があっても問題ないのか、気にするようにしましょう。
小数を計算するときは
10の乗数で整数にしてから計算するか、丸めて整数にしてから計算します。整数にすれば誤差はなくなるのです。
10の乗数で整数にする
10(の何乗か)をかけて、位をずらして整数にすればいい。で、計算結果を10(の何乗か)で割って元の位に戻します。
0.1と0.2に10をかけて1と2にして、1+2を計算して、計算結果の3を最後に10で割るんです。そうすると計算誤差のない0.3という数字が得られます。
0.1×10という小数を含む計算をしているわけなので、厳密には誤差がなくなるわけではないらしいのです。
丸めて整数にする
丸める方法はこちら
四捨五入などをして整数にしてしまいます。誤差をばっさり落としちゃうのです。許容できるのであれば、丸めて整数にしてしまうのが最も安全な方法です。
- 四捨五入 / 切り上げ / 切り下げ / 切り捨て
- 3桁毎にカンマ区切り
- ゼロ埋め(ゼロパディング)
- 不要なゼロを消す(ゼロサプレス)
- 桁数をチェック
小数の省略表示
JavaScriptでは、「0.2」を「.2」、「12.0」を「12.」と省略することがあります。
指数表現
10の16乗は「e16」と表現。2e2で2×102という意味。
314e-2→3.14
16進数
先頭が0x(0X)で始まる数字、A-F(a-f)のアルファベットは16進数として扱われます。
先頭が0x以外の16進数は16進数と認識されません。アルファベットを含むものは数値としてはエラーになります。
0x5C → 92
0x3F→ 63
3F→ エラー
小数点やeによる指数表記はサポートはありません。
8進数
先頭が0の数字は8進数として扱われます。
先頭が0でも、8と9(8進数には存在しない)を含む数字は、10進数です。
09→9(10進数)
0パディングとかたまにありますよね!要注意ですよ。そんな値を変数で受け取っちゃうと、そのまま使う分にはいいけど、計算したらめちゃくちゃですよ。
011 – 09 → 0
先頭が0O(Oo) ゼロ+オーはIllustratorでは8進数になりません。
小数点やeによる指数表記はサポートはありません。
2進数
先頭が0B(0b)はIllustratorでは2進数になりません。
小数点やeによる指数表記はサポートはありません。
NaN
Not a Numberの略。数値ではないということをあらわす数値。数字にできなかった計算結果をあらわす数値です。Excelの#N/Aみたいな? 0を0で割った時、負数の平方根・対数などを求めた場合、parseIntで文字列を数値に変換できなかった場合などにあらわれます。
NaNを含む比較演算はすべてfalseとなります。NaN == NaNも、NaN === NaNもfalseです。どの値と比較しても等しいと判定されません。
NaN であるか判定するためには、isNaN() 関数や isFinite() 関数を使います。
数値がNaNかどうかをチェックする
isNaN(num)
値がNaNならtrue、それ以外はfalse。
nullは0と解釈されるのでfalseを返す。
isNaN(Infinity) →false
isNaN(NaN) →true
if( isNaN(num) ) {
//NaNの場合
} else {
//NaNではない、数値の場合
}
isFinite(num)
NaN、Infinity、-Infifityだったらfalseで他はtrue
Infinity & -Infinity
Infinity(infinity)は「無限大」を表す特別な数値。正の無限大と負の無限大があります。表現可能な最大の値を超えた時、0でない正の値を0で割った時など。
Infinityは加算、減算、乗算、除算を行っても変化しません。
数値⇄文字列
文字列を数値にする →詳細
var result=parseInt(str,10);
var result=parseFloat(str);
var result=Number(str);
var result=str – 0;
数値を文字列にする
var result = num.toString() var result = String( num ); var result = num.toString(); num.toFixed(); num + ”; toExponential toPrecision toLocaleString 文字列(数字以外)、undefinedはtrue、 文字列(数字)、数値、Infinity、true及びfalseはfalse Number.isNaN()? isFiniteは与えられた数がNaNかInfinityまたは-Infifityだったらfalseで他はtrueを返す
0x1A | “26” |
3.14e6 | “3140000” |
16 進数形式の場合は 10 進数にしてから文字列となり、指数表現の場合は小数点形式にしてから文字列となります。
整数かどうかのチェック
if (Number.isInteger(num)) { //整数の時の処理 } else { //整数ではない時の処理 }
数値かそれ以外か
var num = parseFloat("test"); if (isNaN(num)) { //数値でない時 } else { //数値の時 }