簡體   English   中英

如何對“無精度誤差”的數值計算進行單元測試?

[英]How to unit test numerical computation for “no precision error”?

我們有一個用Java編寫的大型系統,在大多數情況下,精度並不那么重要。 因此,我們將所有數字都存儲為雙精度。

但是,幾年后出現了新的要求,在某些罕見的情況下,精度至關重要。 因此,在這種情況下,我需要取一個價格(以double表示),一個底數(也以double表示),並將價格四舍五入到該底數的最接近倍數,然后再次將結果存儲為double

十進制形式很簡單: result = roundDownToBase(price + base*0.5, base)

我了解,天真地將上述公式加倍執行會導致精度問題。 我也知道正確的解決方法是在計算過程中將所有內容都轉換為BigDecimal。

我的問題是,我該如何系統地(單元)測試BigDecimal版本是否不具有Double版本所具有的精度問題? 我可以隨機選擇一些值並聲明結果,但是鑒於輸入的范圍是無限的,這似乎並沒有給我太大的信心。 或者,是否有一種方法可以在單元測試中系統地選擇一些代表性的值,並對代碼質量產生相當高的置信度?

PS我的代碼:

    public static double roundToNear(double price, double base) {
        BigDecimal value = BigDecimal.valueOf(price);
        BigDecimal baseValue = BigDecimal.valueOf(base);
        BigDecimal two = BigDecimal.valueOf(2);
        BigDecimal halfUp = value.add(baseValue.divide(two));
        return roundDownToBase(halfUp.doubleValue(), base);
    }

    public static double roundDownToBase(double value, double base) {
        BigDecimal val1 = BigDecimal.valueOf(value);
        BigDecimal val2 = BigDecimal.valueOf(base);
        BigDecimal remainder = val1.remainder(val2);
        return MathUtil.isZeroOrNaN(remainder.doubleValue()) ? value:val1.subtract(remainder).doubleValue();
    }

我認為在這種情況下,您無法測試這些方法,因為它們是平台方法,在我的經驗單元測試中,是針對您編寫的代碼,例如,如果您認為roundDownToBase(10.01,10.02)應該返回實例5,那么將是有效的測試,否則您將無法測試Double,因為這是平台功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM