【问题标题】:Value was either too large or too small for a Decimal值对于 Decimal 来说太大或太小
【发布时间】:2010-08-05 10:22:56
【问题描述】:

我有以下代码:

double shortfall = GetSomeNumber(); //3.3588548831176006E+29

if (shortfall > 0)
{
  returnValue = Convert.ToDecimal(shortfall);
}

这会产生上述错误。

【问题讨论】:

标签: c# .net


【解决方案1】:

嗯,这是不言自明的。

decimal.MaxValue 是 79,228,162,514,264,337,593,543,950,335 - 你的数字比这个大。

虽然decimal 的精度比double 更高,但double 的范围更大——它可以处理非常非常大和非常非常小的数字。

现在,如果您能告诉我们您真正想要做什么,我们可以帮助您找到解决方案……老实说,混合使用 doubledecimal 并不是一个好主意。

【讨论】:

  • 感谢 Jon,我正在构建一个计算引擎,并且需要访问仅使用双精度数的 Math.Pow。为了显示目的,我转换回十进制。任何指针都会很棒。
  • @Burt - 如果您只是显示它,为什么不显示字符串表示形式?
  • @Burt:你用的是什么电源?对于decimal IME,使用非整数幂相对很少见。对于整数幂,您可以循环和乘法:)
  • @Jon 你是对的,它总是一个整数,但是如果我达到小数的上限,这个错误仍然不会发生吗?
  • @Burt:是的,您在这里仍然存在根本问题 - 但我建议除此之外,留在decimal 的世界中将是一个好主意(或使用@ 987654329@ 开始)。基本上做出选择并坚持下去:)
【解决方案2】:

表示返回的值太大,无法转成十进制。

Decimal 值可以介于正 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间 - 请参阅 MSDN

Double 可以处理更大的数字 - 负 1.79769313486232e308 到正 1.79769313486232e308。这些不会全部转换为十进制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2015-02-19
    • 2013-06-07
    • 2015-06-03
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多