double s = 5.3;
double s1 = 4.2;
System.out.println(s-s1);
输出1.0999999999999996
阿神2017-04-17 17:48:37
Java の基本データ型の float 型と double 型の本質は浮動小数点数です。この場合、浮動小数点数を計算すると、計算結果は正確な値になりません。
したがって、Java はクラス BigDecimal
を提供します。正確なデータ操作 (金額など) を実行する必要がある場合は、このクラスを使用して国を救うことができます...
浮動小数点数の基本的な実装と原則については、计算机原理
などのコースでよく説明されています。関連する情報は自分で見つけることができます...
巴扎黑2017-04-17 17:48:37
ご招待いただきありがとうございます!精度が失われる理由は説明できませんが、解決方法はわかっています。計算前に double などの型を String に変換し、それを java.math.BigDecimal に入れて計算することをお勧めします。 math.BigDecimal には、add() や pide() などの独自の操作メソッドが付属しています。 。計算後に BigDecimal オブジェクトが返され、doubleValue()、intValue()、その他のメソッドを使用して基本データ型に変換されます。
迷茫2017-04-17 17:48:37
ご招待ありがとうございます。この質問については、この記事を参照してください https://zm8.sm-tc.cn/?src=http%3A%2F%2Fz...
伊谢尔伦2017-04-17 17:48:37
コンピューターの演算は二進法だからです。
10 進数の 0.1 を 2 進数に変換すると、無限に繰り返される 10 進数になるため、切り捨てる必要があります。
10 進数の通貨の加算と減算では、切り捨てエラーを避けるために BigDecimal 型 (一部の言語では Decimal と呼ばれます) を使用できます。
MATLAB と同様に、数値クラスを自分で定義することもできます。
エラーとエラーは別のものです。ほとんどの場合、最後の違いは問題ではありません。
例: 倍精度浮動小数点数を使用して地球の円周を計算すると、切り捨て誤差は 0.000001 mm 程度になります。