我有一個數量欄位和一個價格欄位,它們都是小數。可以訂購大量和極其昂貴的東西。兩者的結合在現實生活中從未發生過,但這并不意味著用戶可能會同時輸入巨大的數量和價格。
為了確保我不會在“總計”欄位中得到一個太大的數字,我試圖做一個 decimal.TryParse() 但在乘以 vales 時我得到一個 OverflowException。有誰知道如何避免這種情況?
decimal outvalue;
decimal qty = 10000000000000000;
decimal price = 10000000000000000;
if (!decimal.TryParse((qty * price).ToString(), out outvalue))
{
ModelState.AddModelError("myfield", "Total value is too big");
}
拋出:

uj5u.com熱心網友回復:
什么不只是將兩個decimals 都轉換為double,將它們相乘,最后檢查?
//TODO: put any reasonable value instead of 1e20
if ((double) qty * (double) price > 1e20) {
ModelState.AddModelError("myfield", "Total value is too big");
}
uj5u.com熱心網友回復:
正如@Crowcoder 所說,直截了當的方式,處理溢位例外并在需要時提示用戶
另一種方式:
if (decimal.MaxValue / qty < price)
... sorry, wrong input
(未測驗...)
uj5u.com熱心網友回復:
首先,讓我們了解您的代碼存在的問題:在執行 TryParse 之前引發了例外。如果我們以每行更少的指令擴展您的代碼,您將獲得:
decimal outvalue;
decimal qty = 10000000000000000;
decimal price = 10000000000000000;
decimal total = qty * price; // Exception raised here
string temp = total.ToString();
if (!decimal.TryParse(temp, out outvalue))
{
ModelState.AddModelError("myfield", "Total value is too big");
}
要修復您的代碼,您有一些選擇,我建議您查看BigInterger。您還可以查看已檢查和未檢查的算術背景關系。
uj5u.com熱心網友回復:
除了其他答案,我建議對價格和數量使用一些合理的限制。谷歌建議最昂貴的商品約為 10^10 美元,比您的示例低 6 個數量級。同樣,訂購超過 10^12 個的任何東西都是不可能的,可能會按重量批量訂購非常大量的產品。
小數范圍是 10^28,所以只要你的數量和價格都低于 10^13 就可以了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/445423.html
