微信支付元轉分的正確姿勢

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章