[解決済み] Java 丸め誤差の解決方法 [重複] (英語)
2023-05-09 04:34:23
質問
引き算が何らかの問題を引き起こしているようで、結果の値が間違っているようです。
double tempCommission = targetPremium.doubleValue()*rate.doubleValue()/100d;
78.75 = 787.5 * 10.0/100d
double netToCompany = targetPremium.doubleValue() - tempCommission;
708.75 = 787.5 - 78.75
double dCommission = request.getPremium().doubleValue() - netToCompany;
877.8499999999999 = 1586.6 - 708.75
その結果、期待値は877.85となります。
正しい計算をするためには、どうしたらよいでしょうか。
どのように解決するのですか?
浮動小数点演算の精度を制御するためには java.math.BigDecimal . 読む BigDecimalの必要性 を読んでください。
あなたの例では、最後の行はBigDecimalを使用すると次のようになります。
import java.math.BigDecimal;
BigDecimal premium = BigDecimal.valueOf("1586.6");
BigDecimal netToCompany = BigDecimal.valueOf("708.75");
BigDecimal commission = premium.subtract(netToCompany);
System.out.println(commission + " = " + premium + " - " + netToCompany);
この結果、次のような出力が得られます。
877.85 = 1586.6 - 708.75
関連
-
NullPointerException - java.lang.
-
Java の switch case 文で必要な定数式の問題の解決法
-
Java の double データ型における 0.0 と -0.0 の問題
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
強制型変換について
-
セミコロン期待値エラー解決
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
eclipse にリソースリーク:'in' が閉じない
-
java 365*1000*60*60*24 計算問題
-
[解決済み] Javaで2つのdouble値を比較する方法は?
-
[解決済み] Javaでdoubleを使用して精度を保持する