-1
System.out.println((26.55f/3f));

また

System.out.println((float)( (float)26.55 / (float)3.0 ));

結果 8.849999 を返します。8.85 ではありません。

誰かがこれを説明できますか、それともフロートの使用を避けるべきですか?

4

4 に答える 4

8

すべてのプログラマーが浮動小数点演算について知っておくべきこと:

Q: 0.1 + 0.2 などの数値を足しても 0.3 にならず、代わりに 0.30000000000000004 のような奇妙な結果が得られるのはなぜですか?

A: 内部的に、コンピューターは 0.1、0.2、0.3 などの数値を正確に表すことができない形式 (2 進浮動小数点) を使用しているためです。

リンク先サイトでの詳しい解説

于 2010-04-26T14:09:04.127 に答える
2

浮動小数点に関するウィキペディアの記事、特に精度の問題セクションをご覧ください。

浮動小数点数がすべての実数を正確に表すことができず、浮動小数点演算が真の算術演算を正確に表すことができないという事実は、多くの驚くべき状況につながります。これは、コンピューターが数値を表現する一般的な有限精度に関連しています。

この記事では、より明確にするためのいくつかの例を取り上げています。

于 2010-04-26T14:04:59.203 に答える
2

1.0 / (2 to the Nth power)説明は簡単です。浮動小数点はバイナリ形式であるため、自然整数の整数倍の値のみを正確に表すことができますN26.55にはこのプロパティがないため、正確に表すことはできません。

正確な表現が必要な場合 (たとえば、コードが会計とお金に関するものであり、1 セントの端数が重要である場合)、必要な値の正確な表現を保証する他の型を優先して float を避ける必要があります (アプリケーションによって異なります)。 、たとえば、すべての計算をセントの整数で行うだけで十分かもしれません)。浮動小数点数 (適切かつ適切に使用された場合!-) は、入力値が「無限に正確」になることは決してない工学的および科学的計算には完全に適しているため、正確な表現の計算上の煩雑な負担は、運ぶ価値がありません。

于 2010-04-26T14:08:41.440 に答える
0

まあ、現実的なところではフロートを使うのは避けるべきですが、それはまた別の機会に。

問題は、浮動小数点数は、私たちが些細な表現だと考えるほとんどの数を正確に表すことができないということです。8.850000 はおそらく float では正確に表すことができません。おそらくダブルでもありません。これは、実際には10 進数ではないためです。ただし、バイナリ表現。

于 2010-04-26T14:04:53.227 に答える