- js の世界では数値は全て 64 ビットの
IEEE 754 倍精度浮動小数点数 (double)
- なんだけど
1
.123 (0.123)
みたいな省略もできる - あと
1_000
区切りとか1.23e5
指数表記とか - 意味不明だけど
+0
と-0
があって+0 === -0
は true
- なんだけど
- 変わった表現で
NaN (数値じゃない)
とInfinity, -Infinity (無限)
があるNaN === NaN
は false (こいつは比較式を false にする)
- あとほぼ使わんけど
(2 ** 32) | 0
みたいなビット演算がある- これやると急に数値が 32 ビット整数に丸められる
- 一生
Math.sum()
みたいな集計系が実装されない、あってもいいじゃん ...- reduce でやるか library 使う感じで
とりあえず NaN
出さんように型チェックすること、あと小数点の取り扱いが出てきたら「出力時の丸め」に注意する。
// string => number へ cast
const num = Number('1.5') // 1.5
parseFloat と並んで、罠が多いやつ。
- 第二引数で指定された「基数」の「整数値」を返す
- 整数化するなら後述の
Math.trunc()
で小数点全部切り捨てたほうが良い - 文字列 => 数値化するなら前述の
Number()
cast でいいNumber()
も指数表記になるが、数値ではあるので用途に反した動作にはならないNumber('0.0000005') === 5e-7
もNumber('0.0000005') === 0.0000005
true
// なぜかこいつ Number の staic method のくせに global で呼べる
parseInt('123.45', 10) // 123 (10 進数)
// 文字列変換 5e-7 を挟んで変換してくるので 5 になるサプライズ大好きちゃん
// http://nmi.jp/2022-02-03-dont-use-parseInt
parseInt(0.0000005) // 5
- 小数点以下の桁数を指定して「丸める」
(123.45).toFixed(1) => 123.5
(123.45).toFixed(0) => 123
- round っぽいが厳密には四捨五入じゃなくて近似値を返すらしい
- 返却は number => string になる
- ぶっちゃけ細かい仕様じゃないならこれが楽
- 逆に丸めのロジックが厳密なら使えない
いわゆる「丸め」処理。
// ceil 小数点なんでも + に切り上げる
[3.1, 3.5, 3.8, -3.5].map(Math.ceil) // [ 4, 4, 4, -3 ]
// floor 小数点なんでも - に切り下げる
[3.1, 3.5, 3.8, -3.5].map(Math.floor) // [ 3, 3, 3, -4 ]
// round ししゃごにゅー
[3.1, 3.5, 3.8, -3.5, -3.6].map(Math.round) // [ 3, 4, 4, -3, -4 ]
桁数指定? ウチはそういうのやってません 基本 3 つとも同じで「最終的に丸めたい桁数 n
」を基準に Math.xxx(num x 10 の n 乗) / 10 の n 乗
する感じ。ceil, floor, round 全部同じ。
/**
* 任意の桁で切り上げする
*
* @param {number} value 切り上げする数値
* @param {number} base どの桁で切り上げするか
* (10の位 => 10、小数第1位 => 0.1)
*/
function orgCeil(value, base) {
return Math.ceil(value * base) / base
}
- 「丸め」ではなく 小数点の切り捨て
- 意外と忘れがちなんだけど、整数化するのに便利
- こいつは number => number で返してくれる
- 桁数指定?
ウチはそういうのやってません多分切り捨てだったら文字列操作したほうが早い
そのまんま。こいつと random と丸め系以外 Math ってほとんど使わないな ... 。
Math.max(3, 5, -10, 0, 1) // 5
Math.min(1, 2) // 1