【问题标题】:Decimal.ToUInt64 "Value was either too large or too small for a UInt64Decimal.ToUInt64 "对于 UInt64 而言,值太大或太小
【发布时间】:2013-05-02 16:21:24
【问题描述】:

我在做:-

Decimal production = 0;
Decimal expense = 5000;

Decimal.ToUInt64(production - expense);

但它会抛出异常并显示以下错误消息。

"Value was either too large or too small for a UInt64"

谁能给我一个解决方法。

谢谢!

编辑

无论如何,我希望结果为正数。

【问题讨论】:

  • 负数
  • -1:缺少所需结果的详细信息:您希望 -5000 如何以无符号数表示????

标签: c# type-conversion decimal uint64


【解决方案1】:

问题:-5000m 是负数,超出UInt64 的范围(无符号类型)。

解决方案:如果要处理负数,请使用Int64 而不是UInt64

请注意,您可以只投射而不是调用Decimal.To...

long x = (long) (production - expense);

替代方案:在尝试转换之前验证该数字是否为非负数,并以您认为合适的方式处理它。

非常狡猾的选择:如果您真的只想要绝对值(这似乎不太可能),您可以使用Math.Abs:

UInt64 alwaysNonNegative = Decimal.ToUInt64(Math.Abs(production - expense));

【讨论】:

  • 基本上我希望结果为正数
  • @WaqasRaja:但结果不是一个正数!你真的希望production=0, expense=5000 得到与production=5000, expense=0 相同的结果吗?这听起来非常非常奇怪。
  • 其实是复杂公式的一部分,我需要减法的结果为正数
  • @WaqasRaja:你没有回答这个问题——你真的希望这两种截然不同的情况的结果相同吗?如果是这样,请查看我的编辑并使用Math.Abs。但这似乎不太合适。从根本上说,从 0 中减去 5000 的结果不是一个正数。它只是不是。现在,你想从中得到什么结果,为什么?
【解决方案2】:

0 - 5000 将返回 -5000。并且您正在尝试转换为不能采用负值的 unsigned int。

尝试将其更改为signed int

Decimal.ToInt64(production - expense);

【讨论】:

    【解决方案3】:

    UInt 不能存储负数。你的计算结果是否定的。这就是错误出现的原因。在使用 ToUInt64 之前检查符号并通过 *-1 更正它或使用带符号的 Int64。

    【讨论】:

      【解决方案4】:

      使用

      var result = Decimal.ToInt64(production - expense);
      

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 2017-06-08
        相关资源
        最近更新 更多