我有一个数量字段和一个价格字段,它们都是小数。它可以订购大量的,也非常昂贵的东西。两者的结合在现实生活中从来没有发生过,但这并不意味着用户可能输入一个巨大的数量和价格。
为了确保我不会在“总计”字段中得到太大的数字,我尝试做一个decimal.TryParse(),但是当我乘以这些值时,我得到了一个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");
}抛出:

发布于 2022-03-16 12:52:31
什么不只是将两个decimal转换为double,将它们相乘,最后,检查?
//TODO: put any reasonable value instead of 1e20
if ((double) qty * (double) price > 1e20) {
ModelState.AddModelError("myfield", "Total value is too big");
} 发布于 2022-03-16 13:02:02
如@Crow编码器所说,如果需要,可以直接处理溢出异常并提示用户。
其他方式:
if (decimal.MaxValue / qty < price)
... sorry, wrong input(未经测试.)
发布于 2022-03-16 12:58:58
首先,让我们了解代码的问题:异常是在执行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。您还可以看到检查和未检查算术上下文。
https://stackoverflow.com/questions/71497357
复制相似问题