2
Number(123.456).toFixed(20)

発する

"123.45600000000000306954"

どこ306954から来たの?バイナリで表される数値が正確ではないことはわかっています。しかし、ドキュメントには、number(/.../) を呼び出すと精度が失われるという言及は見つかりませんでした。

mdn言う

指数表記を使用せず、小数点以下の桁数が正確にある数値の文字列表現。数値は必要に応じて丸められ、指定された長さになるように、必要に応じて小数部分にゼロが埋め込まれます。number が 1e+21 より大きい場合、このメソッドは単純に Number.toString() を呼び出し、指数表記の文字列を返します。

編集

toFixed は浮動小数点ではなく固定小数点を返します ... ここに画像の説明を入力

4

1 に答える 1

3

これは、10 進数の浮動小数点表現に完全に関係しています。

コンピュータは123.456正確に表すことができないため、代わりに最も近い 2 進数が使用されます。

浮動小数点ガイドを参照するか、詳細についてはWhat Every Computer Scientist Should Know About Floating-Point Arithmeticを参照してください。

最初のリンクによると、Javascript には組み込みのソリューション (つまり、10 進数型) はありません。BigDecimalこれが好奇心の問題ではなく実際の問題である場合は、Java のクラスのポートが利用可能です。

編集への返信: これは の問題ではありませんNumber。作業例では、整数リテラル ( 123) を宣言します。これらは正確に表すことができます。失敗した例では、浮動小数点リテラルを使用しています。これは、ランタイムによって処理された時点で、正確123.456ではない一連の 2 進数で表されます。 123.456

問題は、それ自体ではなく、浮動小数点リテラルにありNumberます。

于 2012-05-15T15:38:45.903 に答える