_
) のセパレータとしての使用 [ES2021]+
) と単項マイナス (-
)++
) とデクリメント (--
)NaN
Infinity
b32()
: 符号なし32ビット整数を2進数で表示するNumber
の静的プロパティNumber
の静的メソッドNumber.prototype
のメソッドJavaScriptには2種類の数値があります。
この章では数値について説明します。BigIntについては、本書の後半で説明します。
JavaScriptでは、number
型は整数と浮動小数点数の両方で使用されます。
98
123.45
ただし、すべて数値は倍精度浮動小数点数であり、IEEE標準754に従って実装された64ビットの浮動小数点数です。
整数は、単に小数点以下の部分のない浮動小数点数です。
> 98 === 98.0true
内部的には、多くのJavaScriptエンジンは真の整数を、関連するパフォーマンスとストレージサイズの利点とともに使用できることがよくあります。
数値のリテラルを見てみましょう。
いくつかの整数リテラルにより、さまざまな基数を持つ整数を表現できます。
// Binary (base 2)
.equal(0b11, 3); // ES6
assert
// Octal (base 8)
.equal(0o10, 8); // ES6
assert
// Decimal (base 10)
.equal(35, 35);
assert
// Hexadecimal (base 16)
.equal(0xE7, 231); assert
浮動小数点数は、10進数でのみ表現できます。
分数
> 35.035
指数: eN
は ×10N を意味します。
> 3e2300
> 3e-20.03
> 0.3e230
整数リテラルのプロパティにアクセスすると、落とし穴があります。整数リテラルの直後にドットが続く場合、そのドットは小数点として解釈されます。
7.toString(); // syntax error
この落とし穴を回避するには4つの方法があります。
7.0.toString()
7).toString()
(7..toString()
7 .toString() // space before dot
_
) のセパレータとしての使用 [ES2021]長い数値を読みやすくするために桁をグループ化する方法は、長い伝統があります。例えば
ES2021以降、数値リテラルではアンダースコアをセパレータとして使用できます。
const inhabitantsOfLondon = 1_335_000;
const distanceEarthSunInKm = 149_600_000;
他の基数でも、グループ化は重要です。
const fileSystemPermission = 0b111_111_000;
const bytes = 0b1111_10101011_11110000_00001101;
const words = 0xFAB_F00D;
分数と指数にもセパレータを使用できます。
const massOfElectronInKg = 9.109_383_56e-31;
const trillionInShortScale = 1e1_2;
セパレータの配置場所は2つの点で制限されています。
セパレータは2つの数字の間にのみ配置できます。したがって、次の数値リテラルはすべて無効です。
3_.141
3._141
1_e12
1e_12
// valid variable name!
_1464301 1464301_
0_b111111000
0b_111111000
連続して複数のアンダースコアを使用することはできません。
123__456 // two underscores – not allowed
これらの制限の背景にあるのは、構文解析を単純に保ち、奇妙なエッジケースを避けることです。
数値を構文解析するための次の関数は、セパレータをサポートしていません。
Number()
Number.parseInt()
Number.parseFloat()
例えば
> Number('123_456')NaN
> Number.parseInt('123_456')123
その理由は、数値セパレータはコードのためのものであり、他の種類の入力は異なる方法で処理する必要があるためです。
表 5 に、JavaScriptの二項算術演算子が一覧表示されています。
演算子 | 名称 | 例 | |
---|---|---|---|
n + m |
加算 | ES1 | 3 + 4 → 7 |
n - m |
減算 | ES1 | 9 - 1 → 8 |
n * m |
乗算 | ES1 | 3 * 2.25 → 6.75 |
n / m |
除算 | ES1 | 5.625 / 5 → 1.125 |
n % m |
剰余 | ES1 | 8 % 5 → 3 |
-8 % 5 → -3 |
|||
n ** m |
べき乗 | ES2016 | 4 ** 2 → 16 |
%
は剰余演算子です%
は剰余演算子であり、モジュロ演算子ではありません。その結果は、最初のオペランドの符号を持ちます。
> 5 % 32
> -5 % 3-2
剰余とモジュロの違いの詳細については、2alityのブログ投稿“Remainder operator vs. modulo operator (with JavaScript code)”を参照してください。
+
) と単項マイナス (-
)表 6 は、2つの演算子単項プラス (+
) と単項マイナス (-
) をまとめたものです。
演算子 | 名称 | 例 | |
---|---|---|---|
+n |
単項プラス | ES1 | +(-7) → -7 |
-n |
単項マイナス | ES1 | -(-7) → 7 |
どちらの演算子も、オペランドを数値に変換します。
> +'5'5
> +'-12'-12
> -'9'-9
したがって、単項プラスを使用すると、任意の値を数値に変換できます。
++
) とデクリメント (--
)インクリメント演算子++
は、プリフィックス版とポストフィックス版があります。どちらのバージョンでも、オペランドに1を加算します。したがって、そのオペランドは変更可能な記憶域場所である必要があります。
デクリメント演算子--
は同じように機能しますが、オペランドから1を減算します。次の2つの例は、プリフィックス版とポストフィックス版の違いを説明しています。
表 7 は、インクリメント演算子とデクリメント演算子をまとめたものです。
演算子 | 名称 | 例 | |
---|---|---|---|
v++ |
インクリメント | ES1 | let v=0; [v++, v] → [0, 1] |
++v |
インクリメント | ES1 | let v=0; [++v, v] → [1, 1] |
v-- |
デクリメント | ES1 | let v=1; [v--, v] → [1, 0] |
--v |
デクリメント | ES1 | let v=1; [--v, v] → [0, 0] |
次に、これらの演算子の使用例を見ていきます。
プリフィックス++
とプリフィックス--
は、オペランドを変更してから返します。
let foo = 3;
.equal(++foo, 4);
assert.equal(foo, 4);
assert
let bar = 3;
.equal(--bar, 2);
assert.equal(bar, 2); assert
ポストフィックス++
とポストフィックス--
は、オペランドを返してから変更します。
let foo = 3;
.equal(foo++, 3);
assert.equal(foo, 4);
assert
let bar = 3;
.equal(bar--, 3);
assert.equal(bar, 2); assert
これらの演算子をプロパティ値にも適用できます。
const obj = { a: 1 };
++obj.a;
.equal(obj.a, 2); assert
そして、配列要素にも。
const arr = [ 4 ];
0]++;
arr[.deepEqual(arr, [5]); assert
演習: 数値演算子
exercises/numbers-math/is_odd_test.mjs
値を数値に変換する3つの方法があります。
Number(value)
+value
parseFloat(value)
(避けてください。他の2つとは異なります!)推奨事項: 記述的なNumber()
を使用してください。表 8 に、その動作の概要を示します。
x |
Number(x) |
---|---|
undefined |
NaN |
null |
0 |
boolean | false → 0 , true → 1 |
number | x (変更なし) |
bigint | -1n → -1 , 1n → 1 など |
string | '' → 0 |
その他 → 先頭/末尾の空白を無視した解析された数値 |
|
symbol | TypeError をスローします |
object | 構成可能 (例: .valueOf() を介して) |
例
.equal(Number(123.45), 123.45);
assert
.equal(Number(''), 0);
assert.equal(Number('\n 123.45 \t'), 123.45);
assert.equal(Number('xyz'), NaN);
assert
.equal(Number(-123n), -123); assert
オブジェクトが数値に変換される方法は、構成可能です。たとえば、.valueOf()
をオーバーライドすることで構成できます。
> Number({ valueOf() { return 123 } })123
演習: 数値への変換
exercises/numbers-math/parse_number_test.mjs
エラーが発生したときに2つの数値が返されます。
NaN
Infinity
NaN
NaN
は「数値ではない」の略です。皮肉なことに、JavaScriptはそれを数値と見なします。
> typeof NaN'number'
いつNaN
が返されますか?
数値を解析できない場合、NaN
が返されます。
> Number('$$$')NaN
> Number(undefined)NaN
演算を実行できない場合、NaN
が返されます。
> Math.log(-1)NaN
> Math.sqrt(-1)NaN
オペランドまたは引数がNaN
の場合、NaN
が返されます(エラーを伝播するため)。
> NaN - 3NaN
> 7 ** NaNNaN
NaN
の確認NaN
は、それ自身と厳密に等しくない唯一のJavaScript値です。
const n = NaN;
.equal(n === n, false); assert
値x
がNaN
かどうかを確認するいくつかの方法があります。
const x = NaN;
.equal(Number.isNaN(x), true); // preferred
assert.equal(Object.is(x, NaN), true);
assert.equal(x !== x, true); assert
最後の行では、比較の特殊性を使用してNaN
を検出しています。
NaN
の検索一部の配列メソッドはNaN
を見つけることができません。
> [NaN].indexOf(NaN)-1
他のものは見つけることができます。
> [NaN].includes(NaN)true
> [NaN].findIndex(x => Number.isNaN(x))0
> [NaN].find(x => Number.isNaN(x))NaN
残念ながら、簡単な経験則はありません。各メソッドがNaN
をどのように処理するかを確認する必要があります。
Infinity
いつエラー値Infinity
が返されますか?
数値が大きすぎる場合、Infinityが返されます。
> Math.pow(2, 1023)8.98846567431158e+307
> Math.pow(2, 1024)Infinity
ゼロ除算の場合、Infinityが返されます。
> 5 / 0Infinity
> -5 / 0-Infinity
Infinity
Infinity
は他のすべての数値(NaN
を除く)よりも大きいため、優れたデフォルト値になります。
function findMinimum(numbers) {
let min = Infinity;
for (const n of numbers) {
if (n < min) min = n;
}return min;
}
.equal(findMinimum([5, -1, 2]), -1);
assert.equal(findMinimum([]), Infinity); assert
Infinity
の確認値x
がInfinity
かどうかを確認する2つの一般的な方法があります。
const x = Infinity;
.equal(x === Infinity, true);
assert.equal(Number.isFinite(x), false); assert
演習: 数値の比較
exercises/numbers-math/find_max_test.mjs
JavaScript の浮動小数点数は内部的に2進数(IEEE 754 標準準拠)で表現されます。そのため、10進数の小数(10進数)は常に正確に表現できるとは限りません。
> 0.1 + 0.20.30000000000000004
> 1.3 * 33.9000000000000004
> 1.4 * 100000000000000139999999999999.98
したがって、JavaScript で算術演算を行う際には、丸め誤差を考慮する必要があります。
この現象の説明については、以下をお読みください。
クイズ:基礎
クイズアプリ を参照してください。
この章の残りのセクションはすべて上級者向けです。
JavaScript では、数値の計算が常に正しい結果を生成するとは限りません。例えば、
> 0.1 + 0.20.30000000000000004
その理由を理解するには、JavaScript が内部的に浮動小数点数をどのように表現しているかを調べることが必要です。そのためには、合計64ビットのストレージ(倍精度)を占める3つの整数が使用されます。
構成要素 | サイズ | 整数範囲 |
---|---|---|
符号 | 1 ビット | [0, 1] |
仮数部 | 52 ビット | [0, 252−1] |
指数部 | 11 ビット | [−1023, 1024] |
これらの整数によって表される浮動小数点数は、次のように計算されます。
(–1)sign × 0b1.fraction × 2exponent
この表現では、2番目の構成要素(仮数部を含む)は常に先頭に1を持つため、ゼロをエンコードできません。したがって、ゼロは特別な指数-1023と仮数0でエンコードされます。
以降の議論を容易にするために、前の表現を簡略化します。
新しい表現は次のようになります。
mantissa × 10exponent
いくつかの浮動小数点数について、この表現を試してみましょう。
整数-123の場合、主に仮数が必要です。
> -123 * (10 ** 0)-123
1.5の場合、仮数の後に小数点を想像します。小数点を左に1桁移動するために、負の指数を使用します。
> 15 * (10 ** -1)1.5
0.25の場合、小数点を左に2桁移動します。
> 25 * (10 ** -2)0.25
負の指数を持つ表現は、分母の正の指数を持つ分数として書くこともできます。
> 15 * (10 ** -1) === 15 / (10 ** 1)true
> 25 * (10 ** -2) === 25 / (10 ** 2)true
これらの分数により、エンコードできない数値が存在する理由が理解しやすくなります。
1/10
は表現できます。既に必要な形式(分母に10のべき乗)になっています。
1/2
は5/10
として表現できます。分子と分母に5を掛けることで、分母の2を10のべき乗に変換しました。
1/4
は25/100
として表現できます。分子と分母に25を掛けることで、分母の4を10のべき乗に変換しました。
1/3
は表現できません。分母を10のべき乗に変換する方法はありません。(10の素因数は2と5です。したがって、これらの素因数しか含まない分母は、分子と分母に十分な数の2と5を掛けることで、10のべき乗に変換できます。分母に異なる素因数がある場合は、どうしようもありません。)
この小旅行を終えるために、基数2に戻ります。
0.5 = 1/2
は、分母が既に2のべき乗であるため、基数2で表現できます。0.25 = 1/4
は、分母が既に2のべき乗であるため、基数2で表現できます。0.1 = 1/10
は、分母を2のべき乗に変換できないため、表現できません。0.2 = 2/10
は、分母を2のべき乗に変換できないため、表現できません。これで、0.1 + 0.2
が正しい結果を生成しない理由がわかります。内部的には、どちらのオペランドも正確に表現できません。
10進数の小数で正確に計算するには、内部的に基数10に切り替える必要があります。多くのプログラミング言語では、基数2がデフォルトで、基数10はオプションです。例えば、JavaにはBigDecimal
クラスがあり、Pythonにはdecimal
モジュールがあります。JavaScriptにも同様の機能を追加する計画があります。ECMAScript 提案「Decimal」。
整数は、小数点以下の桁がない通常の(浮動小数点)数です。
> 1 === 1.0true
> Number.isInteger(1.0)true
このセクションでは、これらの擬似整数を取り扱うためのいくつかのツールを見ていきます。JavaScript は、真の整数であるbigintもサポートしています。
数値を整数に変換する推奨される方法は、Math
オブジェクトの丸めメソッドのいずれかを使用することです。
Math.floor(n)
:i
≤ n
である最大の整数i
を返します。
> Math.floor(2.1)2
> Math.floor(2.9)2
Math.ceil(n)
:i
≥ n
である最小の整数i
を返します。
> Math.ceil(2.1)3
> Math.ceil(2.9)3
Math.round(n)
:n
に「最も近い」整数を返します。__.5
は切り上げられます。例えば、
> Math.round(2.4)2
> Math.round(2.5)3
Math.trunc(n)
:n
の小数点以下の桁(小数点の後)を削除し、整数に変換します。
> Math.trunc(2.1)2
> Math.trunc(2.9)2
丸めに関する詳細については、§17.3「丸め」を参照してください。
JavaScript の重要な整数の範囲を以下に示します。
>>>
)の範囲:符号なし、[0, 232)これは、JavaScript で安全な整数の範囲です(53ビット + 符号)。
[–(253)+1, 253–1]
整数は、正確に1つの JavaScript 数で表現される場合、安全です。JavaScript の数は、分数に2の指数乗を掛けたものとしてエンコードされるため、より大きな整数も表現できますが、それらの間にはギャップがあります。
例(18014398509481984 は 254)
> 1801439850948198418014398509481984
> 1801439850948198518014398509481984
> 1801439850948198618014398509481984
> 1801439850948198718014398509481988
Number
の次のプロパティは、整数が安全かどうかを判断するのに役立ちます。
.equal(Number.MAX_SAFE_INTEGER, (2 ** 53) - 1);
assert.equal(Number.MIN_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER);
assert
.equal(Number.isSafeInteger(5), true);
assert.equal(Number.isSafeInteger('5'), false);
assert.equal(Number.isSafeInteger(5.1), false);
assert.equal(Number.isSafeInteger(Number.MAX_SAFE_INTEGER), true);
assert.equal(Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1), false); assert
演習:安全な整数の検出
exercises/numbers-math/is_safe_integer_test.mjs
安全でない整数を含む計算を見てみましょう。
次の結果は、両方のオペランドが安全であるにもかかわらず、不正確で安全ではありません。
> 9007199254740990 + 39007199254740992
次の結果は安全ですが、不正確です。最初のオペランドは安全ではなく、2番目のオペランドは安全です。
> 9007199254740995 - 109007199254740986
したがって、式a op b
の結果は、次の場合にのみ正しいです。
isSafeInteger(a) && isSafeInteger(b) && isSafeInteger(a op b)
つまり、両方のオペランドと結果が安全である必要があります。
内部的には、JavaScript のビット演算子は 32 ビット整数で動作します。それらは次の手順で結果を生成します。
各ビット演算子について、この本ではそのオペランドと結果の型について説明しています。各型は常に次の2つのいずれかです。
型 | 説明 | サイズ | 範囲 |
---|---|---|---|
Int32 | 符号付き32ビット整数 | 32ビット(符号を含む) | [−231, 231) |
Uint32 | 符号なし32ビット整数 | 32ビット | [0, 232) |
前述の手順を考慮すると、ビット演算子は内部的に符号なし32ビット整数で動作する(手順「計算」)と仮定し、Int32とUint32は、JavaScript 数値が整数との間でどのように変換されるか(手順「入力」と「出力」)にのみ影響することをお勧めします。
ビット演算子を調査する際に、JavaScript 数値を2進表記の符号なし32ビット整数として表示することが時々役立ちます。それがb32()
の役割です(その実装は後で示します)。
.equal(
assertb32(-1),
'11111111111111111111111111111111');
.equal(
assertb32(1),
'00000000000000000000000000000001');
.equal(
assertb32(2 ** 31),
'10000000000000000000000000000000');
演算 | 名称 | 型シグネチャ | |
---|---|---|---|
~num |
ビット否定、1の補数 | Int32 → Int32 |
ES1 |
ビット否定演算子(表9)は、オペランドの各2進数を反転します。
> b32(~0b100)'11111111111111111111111111111011'
このいわゆる1の補数は、いくつかの算術演算に対して負の数に似ています。例えば、整数をその1の補数に加算すると、常に-1
になります。
> 4 + ~4-1
> -11 + ~-11-1
演算 | 名称 | 型シグネチャ | |
---|---|---|---|
num1 & num2 |
ビットごとの AND | Int32 × Int32 → Int32 |
ES1 |
num1 ¦ num2 |
ビットごとの OR | Int32 × Int32 → Int32 |
ES1 |
num1 ^ num2 |
ビットごとの XOR | Int32 × Int32 → Int32 |
ES1 |
2項ビット演算子(表10)は、オペランドのビットを組み合わせて結果を生成します。
> (0b1010 & 0b0011).toString(2).padStart(4, '0')'0010'
> (0b1010 | 0b0011).toString(2).padStart(4, '0')'1011'
> (0b1010 ^ 0b0011).toString(2).padStart(4, '0')'1001'
演算 | 名称 | 型シグネチャ | |
---|---|---|---|
num << count |
左シフト | Int32 × Uint32 → Int32 |
ES1 |
num >> count |
符号付き右シフト | Int32 × Uint32 → Int32 |
ES1 |
num >>> count |
符号なし右シフト | Uint32 × Uint32 → Uint32 |
ES1 |
シフト演算子(表11)は、2進数を左または右に移動します。
> (0b10 << 1).toString(2)'100'
>>
は最上位ビットを保持し、>>>
は保持しません。
> b32(0b10000000000000000000000000000010 >> 1)'11000000000000000000000000000001'
> b32(0b10000000000000000000000000000010 >>> 1)'01000000000000000000000000000001'
b32()
:符号なし32ビット整数を2進表記で表示するこれまで何度かb32()
を使用しました。次のコードはその実装です。
/**
* Return a string representing n as a 32-bit unsigned integer,
* in binary notation.
*/
function b32(n) {
// >>> ensures highest bit isn’t interpreted as a sign
return (n >>> 0).toString(2).padStart(32, '0');
}.equal(
assertb32(6),
'00000000000000000000000000000110');
n >>> 0
は、n
を右に0ビットシフトすることを意味します。したがって、原則として>>>
演算子は何も行いませんが、それでもn
を符号なし32ビット整数に強制変換します。
> 12 >>> 012
> -12 >>> 04294967284
> (2**32 + 1) >>> 01
JavaScript には、数値に関する次の4つのグローバル関数があります。
isFinite()
isNaN()
parseFloat()
parseInt()
ただし、落とし穴が少ないNumber
の対応するメソッド(Number.isFinite()
など)を使用する方が優れています。これらはES6で導入され、以下で説明します。
Number
の静的プロパティ.EPSILON: number
[ES6]
1とその次に表現可能な浮動小数点数の差。一般的に、マシンイプシロンは浮動小数点演算における丸め誤差の上限を提供します。
.MAX_SAFE_INTEGER: number
[ES6]
JavaScript が明確に表現できる最大の整数(253−1)。
.MAX_VALUE: number
[ES1]
最大の正の有限 JavaScript 数。
.MIN_SAFE_INTEGER: number
[ES6]
JavaScript が明確に表現できる最小の整数(−253+1)。
.MIN_VALUE: number
[ES1]
最小の正の JavaScript 数。約 5 × 10−324。
.NaN: number
[ES1]
グローバル変数NaN
と同じ。
.NEGATIVE_INFINITY: number
[ES1]
-Number.POSITIVE_INFINITY
と同じ。
.POSITIVE_INFINITY: number
[ES1]
グローバル変数`Infinity`と同じです。
.isFinite(num: number): boolean
[ES6]
`num`が実際の数値(`Infinity`、`-Infinity`、`NaN`のいずれでもない)の場合、`true`を返します。
> Number.isFinite(Infinity)false
> Number.isFinite(-Infinity)false
> Number.isFinite(NaN)false
> Number.isFinite(123)true
.isInteger(num: number): boolean
[ES6]
`num`が数値であり、小数部を持たない場合、`true`を返します。
> Number.isInteger(-17)true
> Number.isInteger(33)true
> Number.isInteger(33.1)false
> Number.isInteger('33')false
> Number.isInteger(NaN)false
> Number.isInteger(Infinity)false
.isNaN(num: number): boolean
[ES6]
`num`の値が`NaN`の場合、`true`を返します。
> Number.isNaN(NaN)true
> Number.isNaN(123)false
> Number.isNaN('abc')false
.isSafeInteger(num: number): boolean
[ES6]
`num`が数値であり、明確に整数を表している場合、`true`を返します。
.parseFloat(str: string): number
[ES6]
パラメータを文字列に変換し、浮動小数点数として解析します。文字列を数値に変換するには、`Number()`(先頭と末尾の空白を無視する)は通常、`Number.parseFloat()`(先頭の空白と不正な末尾の文字を無視し、問題を隠す可能性がある)よりも良い選択肢です。
> Number.parseFloat(' 123.4#')123.4
> Number(' 123.4#')NaN
.parseInt(str: string, radix=10): number
[ES6]
パラメータを文字列に変換し、先頭の空白と不正な末尾の文字を無視して整数として解析します。
> Number.parseInt(' 123#')123
パラメータ`radix`は、解析する数値の基数を指定します。
> Number.parseInt('101', 2)5
> Number.parseInt('FF', 16)255
このメソッドを使用して数値を整数に変換しないでください。文字列への強制型変換は非効率的です。最初の非数字の前に停止することは、数値の小数部を除去するための良いアルゴリズムではありません。これが間違っている例を示します。
> Number.parseInt(1e21, 10) // wrong1
`Math`の丸め関数のいずれかを使用して、数値を整数に変換することをお勧めします。
> Math.trunc(1e21) // correct1e+21
(`Number.prototype`は、数値のメソッドが格納されている場所です。)
.toExponential(fractionDigits?: number): string
[ES3]
指数表記を使用して数値を表す文字列を返します。`fractionDigits`を使用すると、指数と掛け算される数値の表示桁数を指定できます(デフォルトでは、必要なだけの桁数を表示します)。
例:`.toString()`で正の指数を取得するには小さすぎる数値。
> 1234..toString()'1234'
> 1234..toExponential() // 3 fraction digits'1.234e+3'
> 1234..toExponential(5)'1.23400e+3'
> 1234..toExponential(1)'1.2e+3'
例:`.toString()`で負の指数を取得するには小さすぎない小数。
> 0.003.toString()'0.003'
> 0.003.toExponential()'3e-3'
.toFixed(fractionDigits=0): string
[ES3]
`fractionDigits`桁に丸められた、指数を含まない数値の表現を返します。
> 0.00000012.toString() // with exponent'1.2e-7'
> 0.00000012.toFixed(10) // no exponent'0.0000001200'
> 0.00000012.toFixed()'0'
数値が1021以上の場合、`.toFixed()`でも指数を使用します。
> (10 ** 21).toFixed()'1e+21'
.toPrecision(precision?: number): string
[ES3]
`.toString()`と同様に動作しますが、`precision`は表示する桁数を指定します。`precision`が省略されている場合、`.toString()`が使用されます。
> 1234..toPrecision(3) // requires exponential notation'1.23e+3'
> 1234..toPrecision(4)'1234'
> 1234..toPrecision(5)'1234.0'
> 1.234.toPrecision(3)'1.23'
.toString(radix=10): string
[ES1]
数値の文字列表現を返します。
デフォルトでは、基数10の数字が結果として得られます。
> 123.456.toString()'123.456'
数字を異なる基数で表現したい場合は、`radix`で指定できます。
> 4..toString(2) // binary (base 2)'100'
> 4.5.toString(2)'100.1'
> 255..toString(16) // hexadecimal (base 16)'ff'
> 255.66796875.toString(16)'ff.ab'
> 1234567890..toString(36)'kf12oi'
`Number.parseInt()`は逆の操作を提供します。つまり、指定された基数を持つ整数(小数部なし!)の数字を含む文字列を数値に変換します。
> Number.parseInt('kf12oi', 36)1234567890
クイズ:上級
クイズアプリ を参照してください。