double price = 4.35;
double quantity = 100;
double total = price * quantity; // Should be 100 * 4.35 = 435.00
System.out.println(total); // Prints 434.99999999999999
なぜこれが起こるのですか?
double の精度は次のようなものです。
倍精度浮動小数点形式は、コンピューターのメモリで 8 バイト (64 ビット) を占有し、浮動小数点を使用して広いダイナミック レンジの値を表すコンピューター数値形式です。32 ビットの格納場所を持つコンピュータは、2 つのメモリ ロケーションを使用して 64 ビットの倍精度数を格納します (1 つの格納場所に単精度数を格納できます)。倍精度浮動小数点形式は通常、64 ビット 10 進形式の decimal64 ではなく、IEEE 754 標準で指定されている binary64 を参照します。
したがって、値 4.35 は 4.35 として正確に保存されるのではなく、正確に保存されます
出典:ウィキ
こちらをご覧ください
乗算は正常に機能していますが、4.35 は double として正確に表すことができません。
浮動小数点の内部表現をチェックしてください。
ウィキは言う: -
浮動小数点数がすべての実数を正確に表すことができず、浮動小数点演算が真の算術演算を正確に表すことができないという事実は、多くの驚くべき状況につながります。これは、コンピュータが数値を表現する一般的な有限精度に関連しています。