[英]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.