Skip to content

Instantly share code, notes, and snippets.

@yano3nora
Last active May 8, 2023 10:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yano3nora/df8524b5571c57cec2c530fa606f2e90 to your computer and use it in GitHub Desktop.
Save yano3nora/df8524b5571c57cec2c530fa606f2e90 to your computer and use it in GitHub Desktop.
[js: Math / number / float] Number (double float) of JavaScript. #js

Overview

Numbers - javascript.info
JavaScriptの数値型完全理解

  • 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 出さんように型チェックすること、あと小数点の取り扱いが出てきたら「出力時の丸め」に注意する。


Number

Number - developer.mozilla.org

// string => number へ cast
const num = Number('1.5') // 1.5

parseInt()

Number.parseInt()

parseFloat と並んで、罠が多いやつ。

  • 第二引数で指定された「基数」の「整数値」を返す
  • 整数化するなら後述の Math.trunc() で小数点全部切り捨てたほうが良い
  • 文字列 => 数値化するなら前述の Number() cast でいい
    • Number() も指数表記になるが、数値ではあるので用途に反した動作にはならない
    • Number('0.0000005') === 5e-7Number('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

toFixed()

toFixed

  • 小数点以下の桁数を指定して「丸める」
    • (123.45).toFixed(1) => 123.5
    • (123.45).toFixed(0) => 123
    • round っぽいが厳密には四捨五入じゃなくて近似値を返すらしい
  • 返却は number => string になる
  • ぶっちゃけ細かい仕様じゃないならこれが楽
    • 逆に丸めのロジックが厳密なら使えない

Math

Math - developer.mozilla.org

Math.ceil / floor / round

【JavaScript】桁指定して四捨五入・切り上げ・切り捨て

いわゆる「丸め」処理。

// 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
}

Math.trunc

Math.trunc

  • 「丸め」ではなく 小数点の切り捨て
  • 意外と忘れがちなんだけど、整数化するのに便利
  • こいつは number => number で返してくれる
  • 桁数指定? ウチはそういうのやってません 多分切り捨てだったら文字列操作したほうが早い

Math.min / max

そのまんま。こいつと random と丸め系以外 Math ってほとんど使わないな ... 。

Math.max(3, 5, -10, 0, 1) // 5
Math.min(1, 2) // 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment