【问题标题】:Divide by zero and no error? [duplicate]除以零并且没有错误? [复制]
【发布时间】:2017-10-30 16:27:20
【问题描述】:

只是拼凑了一个简单的测试,除了我喜欢尝试对我所有的方法进行测试之外,没有任何特殊原因,尽管这个测试非常简单,或者我是这么认为的。

    [TestMethod]
    public void Test_GetToolRating()
    {
        var rating = GetToolRating(45.5, 0);
        Assert.IsNotNull(rating);
    }


    private static ToolRating GetToolRating(double total, int numberOf)
    {
        var ratingNumber = 0.0;

        try
        {
            var tot = total / numberOf;
            ratingNumber = Math.Round(tot, 2);
        }
        catch (Exception ex)
        {
            var errorMessage = ex.Message;
            //log error here
            //var logger = new Logger();
            //logger.Log(errorMessage);
        }


        return GetToolRatingLevel(ratingNumber);
    }

正如您在测试方法中看到的那样,我是除以零。问题是,它不会产生错误。请参阅下面的错误窗口显示。

它给出一个无穷大值而不是一个错误?我错过了什么?所以我搜索了一下,发现双精度数除以零不会产生错误,它们要么给出空值,要么给出无穷大。那么问题就变成了,如何测试 Infinity 返回值?

【问题讨论】:

  • 是的,1.0 / 0double.PositiveInfinity
  • C#中有float.PositiveInfinityfloat.NegativeInfinity。 (或double.PositiveInfinitydouble.NegativeInfinity
  • 整数 尝试除以 0 时会报错,浮点类型不会。
  • float & doubleint & long 具有不同的行为 - 它具有 PositiveInfinityNegativeInfinity 属性,而 intlong@8 将抛出 @98765433如果发生除以零。
  • 有一个静态的double.IsInfinity() 方法来测试无穷大。

标签: c# double divide-by-zero


【解决方案1】:

只有在整数值的情况下,您才会拥有DivideByZeroException

int total = 3;
int numberOf = 0;

var tot = total / numberOf; // DivideByZeroException thrown 

如果至少有一个参数是 浮点 值(问题中的double),您将得到 FloatingPointType.PositiveInfinity 作为结果(double.PositiveInfinity上下文),也不例外

double total = 3.0;
int numberOf = 0;

var tot = total / numberOf; // tot is double, tot == double.PositiveInfinity

【讨论】:

  • 和十进制,因为它没有 NaN 和 Infinity 标志 msdn.microsoft.com/en-us/library/system.decimal.divide
  • @Slai:你说的很对,谢谢你的评论。但由于decimal 是一个特例,(它既不是 integer 也不是 floating point 类型;而是所谓的 binary coded decimal - BCD)我在我的回答中跳过它。
  • 为了迂腐,负分子将返回double.NegativeInfinity,而0 作为分子将返回double.NaN
  • @IllusiveBrian 那么我们也应该考虑零的符号,如果它恰好是浮点数。
  • @IllusiveBrian IEEE 754 定义了负零,因此 double 能够将其与正零区分开来。 IEEE 754 还表示,对于通常的比较,它应该等于正零(但允许可能存在其他比较来区分它们),因此 -0.0 == 0.0 返回 true 而 -0.0 < 0.0 返回 false。
【解决方案2】:

你可以像下面这样检查

double total = 10.0;
double numberOf = 0.0;
var tot = total / numberOf;

// check for IsInfinity, IsPositiveInfinity,
// IsNegativeInfinity separately and take action appropriately if need be
if (double.IsInfinity(tot) || 
    double.IsPositiveInfinity(tot) || 
    double.IsNegativeInfinity(tot))
{
    ...
}

【讨论】:

  • double.IsInfinity() 已经测试了正面或负面版本,因此您只需检查if (double.IsInfinity(tot) ) { ... }See docs here.
  • 谢谢。我的意思是可以检查 IsInfinity 或寻找特定的无穷大(正或负)。也许,我的代码注释没有反映这一点。
  • 当您可以预先检查 numberOf 变量时,后检查的意义何在?
  • 这是真的,但我相信 IsInfinity 的存在有一些非常正当的理由......否则每个人都可以预先检查分母。
  • @TheLethalCoder 除以非零除数仍然可以产生无穷大的结果。考虑 1e300 / 1e-300:两个非零值,但 1e600 的正确结果太大而无法放入 double
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多