首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免decimal.TryParse抛出OverflowException

避免decimal.TryParse抛出OverflowException
EN

Stack Overflow用户
提问于 2022-03-16 12:47:14
回答 4查看 105关注 0票数 1

我有一个数量字段和一个价格字段,它们都是小数。它可以订购大量的,也非常昂贵的东西。两者的结合在现实生活中从来没有发生过,但这并不意味着用户可能输入一个巨大的数量和价格。

为了确保我不会在“总计”字段中得到太大的数字,我尝试做一个decimal.TryParse(),但是当我乘以这些值时,我得到了一个OverflowException。有没有人有什么聪明的想法来避免这种情况?

代码语言:javascript
复制
decimal outvalue;
decimal qty = 10000000000000000;
decimal price = 10000000000000000;

if (!decimal.TryParse((qty * price).ToString(), out outvalue))
{
    ModelState.AddModelError("myfield", "Total value is too big");
}

抛出:

EN

回答 4

Stack Overflow用户

发布于 2022-03-16 12:52:31

什么不只是将两个decimal转换为double,将它们相乘,最后,检查?

代码语言:javascript
复制
  //TODO: put any reasonable value instead of 1e20 
  if ((double) qty * (double) price > 1e20) {
    ModelState.AddModelError("myfield", "Total value is too big");
  } 
票数 3
EN

Stack Overflow用户

发布于 2022-03-16 13:02:02

如@Crow编码器所说,如果需要,可以直接处理溢出异常并提示用户。

其他方式:

代码语言:javascript
复制
if (decimal.MaxValue / qty < price)
... sorry, wrong input

(未经测试.)

票数 3
EN

Stack Overflow用户

发布于 2022-03-16 12:58:58

首先,让我们了解代码的问题:异常是在执行TryParse之前引发的。如果我们以较少的每行指令展开您的代码,您将得到:

代码语言:javascript
复制
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。您还可以看到检查和未检查算术上下文。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71497357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档