1.背景
近期做了一個涉及微信支付的項目,由於工期比較緊張,所以引用了一款GitHub上的第三方SDK,開發效率還是蠻高的。但是在使用的過程中,確實也遇到一些bug。此處分享一下元轉分的正確實現方式。
2.第三方SDK之前的遺漏版本
1.源代碼
public static Integer Yuan2Fen(Double yuan) {
//(重點)Double直接轉BigDecimal丟失精度
return new BigDecimal(yuan).movePointRight(2).intValue();
}
2.測試
public class YuanToFenTest {
//錯誤的元轉分方式
public static Integer WrongYuan2Fen(Double yuan) {
//(重點)Double直接轉BigDecimal丟失精度
return new BigDecimal(yuan).movePointRight(2).intValue();
}
public static void main(String[] args) {
Double money = 0.03;
BigDecimal bmoney = new BigDecimal(money);
System.out.println("Double直接轉BigDecimal結果:"+bmoney);
Integer wmoney = WrongYuan2Fen(money);
System.out.println("錯誤的元轉分結果:"+wmoney);
}
}
3.測試運行結果
Double直接轉BigDecimal結果:0.0299999999999999988897769753748434595763683319091796875
錯誤的元轉分結果:2
3.元轉分的正確姿勢
1.源代碼
public static Integer Yuan2Fen(Double yuan) {
return new BigDecimal(String.valueOf(yuan)).movePointRight(2).intValue();
}
2.測試
public class YuanToFenTest {
//正確的元轉分方式
public static Integer CorrectYuan2Fen(Double yuan) {
//(重點)Double直接轉BigDecimal丟失精度,此處需要將Double轉換爲String
return new BigDecimal(String.valueOf(yuan)).movePointRight(2).intValue();
}
public static void main(String[] args) {
Double money = 0.03;
Integer cmoney = CorrectYuan2Fen(money);
System.out.println("正確的元轉分結果:"+cmoney);
}
}
3.測試運行結果
正確的元轉分結果:3
4.另一種方式
將Double類型轉換爲BigDecimal類型:
Double money=0.03;
BigDecimal bmoney = BigDecimal.valueOf(money);