TypeScript Deep Dive 日本語版
  • TypeScript Deep Dive 日本語版
  • TypeScript入門 & 環境構築
    • なぜTypeScriptを使うのか?
  • JavaScript
    • 等価演算子の同一性
    • リファレンス
    • nullとundefined
    • this
    • クロージャ
    • Number型
    • Truthy
  • モダンなJavaScriptの機能
    • クラス
      • Classes Emit
    • アロー関数
    • 残余引数(Restパラメータ)
    • let
    • const
    • 分割代入
    • スプレッド演算子
    • for...of
    • Iterator
    • テンプレートリテラル
    • Promise
    • ジェネレータ
    • async await
  • プロジェクトの環境設定
    • コンパイルコンテキスト
      • tsconfig.json
      • コンパイル対象ファイルの設定
    • 宣言空間
    • ファイルモジュール
      • ファイルモジュールの詳細
      • global.d.ts
    • 名前空間
    • 動的インポート
  • Node.js & TypeScriptのプロジェクト作成
  • React & TypeScriptのプロジェクト作成
  • TypeScriptの型システム
    • JavaScriptからの移行ガイド
    • @types パッケージ (DefinitelyTyped)
    • アンビエント宣言(declare)
      • 型定義ファイル
      • グローバル変数の宣言
    • インターフェース
    • Enum
    • lib.d.ts
    • 関数の型
    • 呼び出し可能オブジェクト
    • Type Assertion(型アサーション)
    • Freshness
    • 型ガード
    • リテラル型
    • Readonly
    • ジェネリック型
    • 型推論
    • 型の互換性
    • never
    • 判別可能なUnion型
    • Index signature(インデックス型)
    • 型の移動
    • 例外のハンドリング
    • ミックスイン
  • JSX
    • React
    • React以外のJSX
  • オプション
    • noImplicitAny
    • strictNullChecks
  • TypeScriptのエラー
    • エラーの理解
    • 一般的なエラー
  • NPM
  • テスト
    • Jest
    • Cypress
  • ツール
    • Prettier
    • Husky
    • Changelog
  • その他のヒント
    • String Based Enums
    • Nominal Typing
    • Stateful Functions
    • Bind is Bad
    • Currying
    • Type Instantiation
    • Lazy Object Literal Initialization
    • Classes are Useful
    • Avoid Export Default
    • Limit Property Setters
    • outFile caution
    • JQuery tips
    • static constructors
    • singleton pattern
    • Function parameters
    • Build Toggles
    • Barrel
    • Create Arrays
    • Typesafe Event Emitter
  • スタイルガイド(コーディング規約)
  • TypeScriptコンパイラの内側
    • Program
    • AST
      • TIP: Visit Children
      • TIP: SyntaxKind enum
      • Trivia
    • Scanner
    • Parser
      • Parser Functions
    • Binder
      • Binder Functions
      • Binder Declarations
      • Binder Container
      • Binder SymbolTable
      • Binder Error Reporting
    • Checker
      • Checker Diagnostics
      • Checker Error Reporting
    • Emitter
      • Emitter Functions
      • Emitter SourceMaps
    • Contributing
GitBook提供
このページ内
  • コアな型
  • 10進数(Decimal)
  • 整数(Integer)
  • big.js
  • NaN
  • 無限(Infinity)
  • 無限小(Infinitesimal)

役に立ちましたか?

  1. JavaScript

Number型

プログラミングで数値を扱うときは、その言語における数値の扱いに注意する必要があります。ここでは、JavaScriptで数字に関して注意するべき、いくつかの重要な点を説明します。

コアな型

JavaScriptにはたった1つの数値型しかありません。倍精度の64ビットの数値(Number)です。以下でその限界値と望ましい解決策について説明します。

10進数(Decimal)

他の言語におけるdouble / floatに精通している人であれば、バイナリの浮動小数は10進数の小数と正しく対応していないことを知っているでしょう。 JavaScriptの数値を使った簡単な(そして有名な)例を以下に示します:

console.log(.1 + .2); // 0.30000000000000004

正しい小数演算のためには、以下に述べるbig.jsを使います。

整数(Integer)

整数値の限界は、組み込みの数値型Number.MAX_SAFE_INTEGERとNumber.MIN_SAFE_INTEGERによって決まります。

console.log({max: Number.MAX_SAFE_INTEGER, min: Number.MIN_SAFE_INTEGER});
// {max: 9007199254740991, min: -9007199254740991}

数値の扱いにおける安全とは、丸め誤差が起きた数値ではないことが確実であることです。

安全でない値は、安全な限界値から+1 か -1離れた値であり、どんな値の加算/減算でも、結果を丸めるでしょう。

console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); // true!
console.log(Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2); // true!

console.log(Number.MAX_SAFE_INTEGER);      // 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1);  // 9007199254740992 - Correct
console.log(Number.MAX_SAFE_INTEGER + 2);  // 9007199254740992 - Rounded!
console.log(Number.MAX_SAFE_INTEGER + 3);  // 9007199254740994 - Rounded - correct by luck
console.log(Number.MAX_SAFE_INTEGER + 4);  // 9007199254740996 - Rounded!

安全性をチェックするには、ES6のNumber.isSafeIntegerを使用します:

// 安全な値
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER)); // true

// 危険な値
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1)); // false

// なぜならオーバーフローによって値が丸められている可能性があるからです
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 10)); // false

big.js

  • 完全無欠な10進演算

  • 安全な範囲外の整数値

インストールは簡単です:

npm install big.js @types/big.js

簡単な使用例:

import { Big } from 'big.js';

export const foo = new Big('111.11111111111111111111');
export const bar = foo.plus(new Big('0.00000000000000000001'));

// numberを得る方法
const x: number = Number(bar.toString()); // 小数点以下の精度を失う

このライブラリは、チャートやキャンバスの描画など、UI /パフォーマンスが重視される目的には使用しないでください。

NaN

数値計算が有効な数値で表現できない場合、JavaScriptは特別なNaN値を返します。古典的な例は虚数です。

console.log(Math.sqrt(-1)); // NaN

注:等価演算子はNaN値では機能しません。代わりにNumber.isNaNを使用してください:

// これはしないでください
console.log(NaN === NaN); // false!!

// こうしてください
console.log(Number.isNaN(NaN)); // true

無限(Infinity)

Numberで表現可能な値の境界は、Number.MAX_VALUEと-Number.MAX_VALUEの値として利用できます。

console.log(Number.MAX_VALUE);  // 1.7976931348623157e+308
console.log(-Number.MAX_VALUE); // -1.7976931348623157e+308

精度が変更されない範囲外の値は、これらの限界値に制限されます。

console.log(Number.MAX_VALUE + 1 == Number.MAX_VALUE);   // true!
console.log(-Number.MAX_VALUE - 1 == -Number.MAX_VALUE); // true!

精度が変更される範囲外の値は、特殊な値Infinity/-Infinityに解決されます。

console.log(Number.MAX_VALUE + 10**1000);  // Infinity
console.log(-Number.MAX_VALUE - 10**1000); // -Infinity

もちろん、これらの無限大値は、それを必要とする算術演算でも現れます。

console.log( 1 / 0); // Infinity
console.log(-1 / 0); // -Infinity

以下のように、これらのInfinity値を手動で使うか、Numberクラスの静的メンバを使うことができます:

console.log(Number.POSITIVE_INFINITY === Infinity);  // true
console.log(Number.NEGATIVE_INFINITY === -Infinity); // true

幸運なことに、比較演算子(</ >)は無限値に対して確実に正しく動作します:

console.log( Infinity >  1); // true
console.log(-Infinity < -1); // true

無限小(Infinitesimal)

Numberで表現可能なゼロでない最小値は、静的なNumber.MIN_VALUEとして使用できます。

console.log(Number.MIN_VALUE);  // 5e-324

MIN_VALUEより小さい値(アンダーフロー値)は0に変換されます。

console.log(Number.MIN_VALUE / 10);  // 0

より直感的に: Number.MAX_VALUEより大きい値がINFINITYに丸められるように、Number.MIN_VALUEより小さい値は0に丸められます。

前へクロージャ次へTruthy

最終更新 2 年前

役に立ちましたか?

JavaScriptは、最終的に がサポートされます。現時点では、任意精度整数の計算を行いたい場合は、下記のbig.jsを使います。

財務計算(例:GST計算、セントでのお金、追加など)のために数学を使用する場合は、のようなライブラリを使用します。

BigInt
big.js