我將舉一個我的實際情況的簡單例子:Java,BigDecimal:如何對舍入錯誤進行單元測試?
假設我必須在Java中實現一些代碼來計算Weighted arithmetic mean。我給出了兩個浮點值數組(表示爲雙精度值),每個數值長度相同,第一個包含值,第二個值包含它們各自的權重。
讓我們也說,我做了一些實現,它返回一個浮點值(也是雙)表示輸入值的加權算術平均值:
public static double calculateWeightedArithmeticMean(double[] values,
double[] weights) {
if(values.length != weights.length) {
throw new IllegalArgumentException();
}
if(values.length == 0) {
return 0;
}
if(values.length == 1) {
return new BigDecimal(values[0]).setScale(1, RoundingMode.HALF_UP).
doubleValue();
}
BigDecimal dividend = BigDecimal.ZERO;
BigDecimal divisor = BigDecimal.ZERO;
for(int i = 0; i < values.length; i++) {
dividend = dividend.add(new BigDecimal(values[i]).
multiply(new BigDecimal(weights[i])));
divisor = divisor.add(new BigDecimal(weights[i]));
}
if(dividend.compareTo(BigDecimal.ZERO) == 0) {
return 0d;
}
return dividend.divide(divisor, 1, RoundingMode.HALF_UP).doubleValue();
}
我寫單元測試經過幾個值(像3個值+3個權重)。我首先手動計算加權算術平均值(使用計算器),然後編寫一個單元測試,檢查我的代碼是否返回該值。
我相信這樣的測試不適用於由於舍入誤差而使用的值的數量大得多的情況。也許我已經實現的代碼對於3個值+3的權重(對於給定的精度)運行良好,因爲在這種情況下舍入誤差小於精度,但很可能捨入誤差變得大於期望的精度1000值+ 1000重量。
我的問題是:
- 應該我也寫一個單元測試,用來檢查一個非常大的數字值(一個「最壞的情況」生產使用)?
- 如果我應該如何寫它?如何獲得正確的值,以便我可以在測試中使用它(計算2x1000值的手段似乎是一種壞主意,即使使用Weighted mean calculator ...)?
- 也是如此相似的場景:計算geometric mean,等...
謝謝,這是一個很棒的答案。 – 2014-10-01 10:09:38