簡體   English   中英

Math.Ceil(Java)的浮點精度

[英]Floating point precision with Math.Ceil (Java)

我正在實施一項業務規則,以計算庫存水平上的百分比增長:

Stock level | Percentage Increase | Expected output
    100     |           93        |        193

由於沒有明確定義十進制庫存水平,因此規則是對輸出進行四舍五入:

public int calculateStockLevel(int rawStockLevel, double percentageIncrease) {
    return Math.ceil(rawStockLevel * (1 + (percentageIncrease / 100));
}

上面情況的實際輸出: 194 (測試失敗)

這看起來像浮點精度錯誤,請問有什么優雅且可讀的方法可以使該測試通過?

您應該使用BigDecimal來指定所需的精度,但是對於您而言,您可以做一些更簡單的事情:只需在末尾除以100。

public int calculateStockLevel(int rawStockLevel, double percentageIncrease) {
    return Math.ceil(rawStockLevel * (100 + percentageIncrease) / 100);
}

二進制浮點類型不能完全以十進制表示每個值。 因此, percentageIncrease / 100將獲得最接近的二進制表示形式。 在您的情況下,雙精度的0.93的精確值是0.930000000000000048849813013083507 ,該值略大於真實的十進制值。 因此,在ceil之后,它會四舍五入到0.94

如果要精確的十進制輸出,則必須使用十進制算術,例如BigDecimal 但是,在您的情況下,您可以利用純整數進行處理,利用這樣的事實:如果除法的余數非零,則結果的小數部分必須大於0。

int temp   = rawStockLevel * (100 + percentageIncrease);
int result = temp/100;
if (temp % 100 != 0)
    result++; // round up if not divisible by 100
return result;

暫無
暫無

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

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