6

JavaScriptを使用して単純なパーセンテージ計算機を作成しようとしています。

コンソールで簡単な計算を試みます (試してください):

106 / 100 * 10

そして、それは私を返します:

10.600000000000001

ここで何が起こっているのですか?ブラケットは違いがなく、これはすべての数値で発生するわけではありません。結果は10.6正しいと思いますか?誰でも説明できますか?これはブラウザ固有のものではなく、Chrome 開発ツールと firebug で発生します。

4

5 に答える 5

5

いいえ、結果は十分に正しいです (演算の順序を変更すると別の結果になる可能性がありますが)、これは IEEE754 浮動小数点ストレージの奇跡の 1 つです: 数値が表示どおりに格納されないという事実の結果、それはいくつかの10進数とカンマですが、

K * 2 ^ N

ここで、K と N は符号付き整数です。

もちろん、すべての数値を正確に格納できるわけではないため、他の数値はアプローチするだけです。

この IEEE754 コンピューティングの概要を読むことをお勧めします。

必要なのは、ユーザーに出力するときに数値をフォーマットすることです。たとえば、

var string = myNumber.toFixed(1);
于 2013-05-10T19:13:43.937 に答える
4

すべての 10 進数が 2 進数で正確に表現されるわけではないため、浮動小数点数を計算しようとすると、このような問題が頻繁に発生します。

バイナリに変換すると、操作は次のようになります。

106 = 64 + 32 + 8 + 2 = 1101010
100 = 64 + 32 + 4 = 1100100
1101010 / 1100100 = 1010.10011001100...

次に、これに 10、または 2 進数で 101 を掛けると、次のようになります。

1010.10011001100... * 101 = 1010.1001100110011001100...

これは10.6 とはまったく評価されません。

特定のケースでは、数値は 1010.10011001100110011001100110011001、つまり 36 ビットで切り捨てられています。

于 2013-05-10T19:15:02.683 に答える
0

倍精度。数値は 2 の累乗としてコンピュータに格納されます。たとえば1/2 + 1/4 + 1/8...、10 進数として印刷すると、正確ではない場合があります。

于 2013-05-10T19:14:21.837 に答える
0

(106 / 1000) * 100 を試すことができます

于 2013-05-10T19:16:28.267 に答える