【问题标题】:Does C# throw OverflowException for floating point numbers?C# 是否为浮点数抛出 OverflowException?
【发布时间】:2020-08-02 10:55:18
【问题描述】:

C# 编译器会为浮点数值类型抛出 OverflowException 吗?

我试过这个来弄明白:

try
{
    checked
    {
        double d = Convert.ToDouble(Math.Pow(double.MaxValue, double.MaxValue));
        Console.WriteLine(d);
    }
}
catch (OverflowException)
{
    throw;
}

我在控制台窗口中看到的是一个∞。

在调试时 ∞ 是否比异常更有用?

【问题讨论】:

  • 根据here,转换可能抛出的异常之一是溢出异常。为什么我什么都没有?
  • 不,正如您已经观察到的,它不会在大多数溢出情况下抛出。另请注意,checkedunchecked 也是如此)关键字仅适用于直接编译到块内部的代码,不适用于从块内部调用的方法。
  • 如果你尝试将一个太大的数字转换为双精度数,它会导致异常,但如果你添加两个溢出的大数字,它不会抛出。不一致,我知道,但就是这样。
  • here 中它说:OverflowException .NET Framework 和 .NET Core 2.2 及更早版本:s 表示小于 MinValue 或大于 MaxValue 的数字。但是,它是关于 double.Parse 的。

标签: c# exception overflowexception


【解决方案1】:

不,C# 没有浮点运算例外。

浮点类型有 3 个特殊值:正无穷大、负无穷大和“非数字”。

如果计算的结果大于可以表示的结果,则溢出而不抛出异常,结果为正无穷大。 是它在字符串中的表示方式。

【讨论】:

    【解决方案2】:

    也不例外,它向您显示正确的值,即 INFINITY ()。

    你也可以通过bool isInfinity = double.IsInfinity(d);查看

    它也会为bool isInfinity = double.IsInfinity(1.0/0);返回true

    我正在使用 .Net 核心 3.1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 2011-10-03
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多