イルカエルフ:https : //mgo.whhtjl.com
1.乗算を行います(精度の問題)
Youke GOのビジネス要件:カードユーザーが支払いに成功すると、カード料金の30%が小数点以下2桁で直接プロモーターに報酬され、破棄された(切り捨てられた)小数の前の数値は決して増加しません。
package test;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test {
public static void main(String[] args) {
String money="0.1";//卡费
BigDecimal reallyPayMoney=new BigDecimal(money);
System.out.println("结果:"+reallyPayMoney.multiply(new BigDecimal(0.3)).setScale(2, RoundingMode.DOWN));
}
}
上記のコードを実行すると、次のような結果が表示されます。
ええと、0.1 * 0.3は0.03と等しくないのですか?どうすれば0.02になりますか?
その後、Decimalが乗算演算を行うときに0.3を浮動小数点に変換することが発見されましたが、精度が不十分なために値が変化し、理想的な値を計算できませんでした。
解決策は、初期化中にパラメータを文字列型に設定することです
コードを変更した後、再度実行すると、結果は次のようになります。
2.除算(無限ループ10進数が表示されます)
System.out.println(BigDecimal.ONE.divide(new BigDecimal("3")));
以下に示すように、エラーを実行します。
解決策は、操作中に精度を設定し、コードを変更して実行することです。結果は次のとおりです。
OK