From 42af0a803e8998395fc6f3761fdda12182de71f5 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sat, 12 Oct 2024 01:10:14 +0900 Subject: [PATCH] =?UTF-8?q?2024/07/13=20=E6=99=82=E7=82=B9=E3=81=AE?= =?UTF-8?q?=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5=E3=81=8D?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global_objects/number/tostring/index.md | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/files/ja/web/javascript/reference/global_objects/number/tostring/index.md b/files/ja/web/javascript/reference/global_objects/number/tostring/index.md index b238d10f13bb8a..a90e3bbef3eecf 100644 --- a/files/ja/web/javascript/reference/global_objects/number/tostring/index.md +++ b/files/ja/web/javascript/reference/global_objects/number/tostring/index.md @@ -2,12 +2,12 @@ title: Number.prototype.toString() slug: Web/JavaScript/Reference/Global_Objects/Number/toString l10n: - sourceCommit: fcd80ee4c8477b6f73553bfada841781cf74cf46 + sourceCommit: 6e93ec8fc9e1f3bd83bf2f77e84e1a39637734f8 --- {{JSRef}} -**`toString()`** メソッドは、指定された数値を表現する文字列を返します。 +**`toString()`** は {{jsxref("Number")}} 値のメソッドで、この数値を表現する文字列を返します。 {{EmbedInteractiveExample("pages/js/number-tostring.html")}} @@ -25,12 +25,14 @@ toString(radix) ### 返値 -指定された数値を表現する文字列です。 +指定された数値を表現する文字列です。基数が 10 で、(符号を無視した)数値の規模が 1021 以上または 10-6 以下の場合には、科学記数法が使用されます。 ## 例外 - {{jsxref("RangeError")}} - - : `toString()` は、与えられた `radix` が `2` 未満、または `36` を超える場合、{{jsxref("RangeError")}} が発生します。 + - : `radix` が 2 未満、または 36 を超える場合に発生します。 +- {{jsxref("TypeError")}} + - : {{jsxref("Number")}} ではないオブジェクトに対してこのメソッドが呼び出された場合に発生します。 ## 解説 @@ -49,9 +51,18 @@ console.log((10 ** 21.5).toString()); // "3.1622776601683794e+21" console.log((10 ** 21.5).toString(8)); // "526665530627250154000000" ``` +浮動小数点数の基本的な表現は、2 進法の科学記法です([数値エンコード](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#数値のエンコーディング)を参照)。しかし、`toString()` メソッドは、数値の値のこの最も正確な表現を直接使用しません。むしろ、アルゴリズムは、隣接する数値の値から出力を区別するために必要な最小の有効数字を使用します。例えば、数値が大きい場合、同じ浮動小数点数に対して等価な文字列表現が多数存在することになり、`toString()` は右側に最も多くの 0 があるもの(任意の基数に対して)を選択します。 + +```js +console.log((1000000000000000128).toString()); // "1000000000000000100" +console.log(1000000000000000100 === 1000000000000000128); // true +``` + +一方、{{jsxref("Number.prototype.toFixed()")}} および {{jsxref("Number.prototype.toPrecision()")}} を使用すると、精度を指定でき、 `toString()` よりも正確な結果を得ることができます。 + この `toString()` メソッドは、`this` 値が数値プリミティブまたは `Number` ラッパーオブジェクトである必要があります。他の `this` 値に対しては、数値に変換しようとせずに {{jsxref("TypeError")}} を発生させます。 -`Number` には [`[@@toPrimitive]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive) メソッドがないので、 `Number` _オブジェクト_ が[テンプレートリテラル](/ja/docs/Web/JavaScript/Reference/Template_literals) などのように文字列を期待するコンテキストで用いられるとき、 JavaScript は `toString()` メソッドを自動的に呼び出します。しかし、数値プリミティブは `toString()` メソッドを参照して [coerced to strings] (/ja/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion) するのではなく、初期の `toString()` 実装と同じアルゴリズムを使用して直接変換される。 +`Number` には [`[Symbol.toPrimitive]()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive) メソッドがないので、 `Number` _オブジェクト_ が[テンプレートリテラル](/ja/docs/Web/JavaScript/Reference/Template_literals) などのように文字列を期待するコンテキストで用いられるとき、 JavaScript は `toString()` メソッドを自動的に呼び出します。しかし、数値プリミティブは `toString()` メソッドを参照して[文字列へ変換](/ja/docs/Web/JavaScript/Reference/Global_Objects/String#文字列変換)するのではなく、初期の `toString()` 実装と同じアルゴリズムを使用して直接変換される。 ```js Number.prototype.toString = () => "Overridden"; @@ -86,7 +97,7 @@ const hex = "CAFEBABE"; const bin = parseInt(hex, 16).toString(2); // "11001010111111101011101010111110" ``` -精度の低下に注意してください。元となる数値文字列が大きすぎる(例えば [`Number.MAX_SAFE_INTEGER`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) より大きい)場合、代わりに [`BigInt`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt) を使用してください。ただし、`BigInt` コンストラクタは、数値リテラルを表す文字列(`0b`, `0o`, `0x` から始まる文字列)にしか対応していません。元の基数が 2 進数、8 進数、10 進数、16 進数のいずれでもない場合は、基数変換を手で書くか、ライブラリーを使用する必要があるかもしれません。 +精度の低下に注意してください。元となる数値文字列が大きすぎる(例えば [`Number.MAX_SAFE_INTEGER`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) より大きい)場合、代わりに [`BigInt`](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt) を使用してください。ただし、`BigInt` コンストラクターは、数値リテラルを表す文字列(`0b`, `0o`, `0x` から始まる文字列)にしか対応していません。元の基数が 2 進数、8 進数、10 進数、16 進数のいずれでもない場合は、基数変換を手で書くか、ライブラリーを使用する必要があるかもしれません。 ## 仕様書