Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Web/JavaScript/Reference/Global_Objects/Number/toString を更新 #23990

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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")}}

Expand All @@ -25,12 +25,14 @@ toString(radix)

### 返値

指定された数値を表現する文字列です。
指定された数値を表現する文字列です。基数が 10 で、(符号を無視した)数値の規模が 10<sup>21</sup> 以上または 10<sup>-6</sup> 以下の場合には、科学記数法が使用されます。

## 例外

- {{jsxref("RangeError")}}
- : `toString()` は、与えられた `radix` が `2` 未満、または `36` を超える場合、{{jsxref("RangeError")}} が発生します。
- : `radix` が 2 未満、または 36 を超える場合に発生します。
- {{jsxref("TypeError")}}
- : {{jsxref("Number")}} ではないオブジェクトに対してこのメソッドが呼び出された場合に発生します。

## 解説

Expand All @@ -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";
Expand Down Expand Up @@ -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 進数のいずれでもない場合は、基数変換を手で書くか、ライブラリーを使用する必要があるかもしれません。

## 仕様書

Expand Down