比较double.MaxValue的相等性是一个好主意吗?

时间:2011-04-21 22:10:26

标签: c# .net cls-compliant

可以询问浮动...或MinValue的相同问题。

我正在考虑将其用作特殊值。我会看到精确的错误吗?我不希望用这些数字算术,只需设置它们即可。

澄清:我使用它来获得哨兵价值。

是否在C#规范中描述了什么?

5 个答案:

答案 0 :(得分:10)

这取决于你如何使用它。

如果你使用double.MaxValue作为具有特殊语义的标记或标记值,那么是的,它只是你要比较的一点模式。例如,您可以使用double.MaxValue来表示“未初始化”或“未知”值。还有其他方法可以做到这一点(例如,使用可空的double?),但使用double.MaxValue也是合理的,假设您的域中不会自然出现该值。

如果你有一些任意的double值,并且你想看看它是否与double.MaxValue“相等”,那么你会想看看这些数字是否在一个小范围内(因为在计算其他double值时某些精度可能会丢失,所以彼此之间存在差异。要注意的问题是值超出double.MaxValue,会产生溢出情况。

答案 1 :(得分:2)

如果您将double.MaxValuedouble.MaxValue进行比较,那么它们将是相同的。二进制表示是相同的,不会有问题。另一方面,如果你尝试类似的东西:

double myDouble = (double.MaxValue - 3.1415) / 2;
if((myDouble * 2) + 3.1415 == double.MaxValue)
{
    ...
}

然后是的,你可能会开始看到弹出奇怪的精度问题。

以下是无法与自身进行比较的特殊常量。其他任何事都是合理的游戏。

  • 的NaN
  • NegativeInfinity
  • PositiveInfinity时

答案 2 :(得分:1)

使用“特殊值”通常是不好的做法。我更喜欢使用具有某种状态代码的对象,然后使用仅在状态为非特殊情况时填充的double(/ float / whatever)。

public class CalcNumber
{
    public CalcNumberStatus Status {get; private set;}
    public double Value {get; private set;}


    public CalcNumber(double value)
    {
        Status = CalcNumberStatus.Normal;
        Value = value;
    }

    public CalcNumber(CalcNumberStatus status)
    {
        if(status == CalcNumberStatus.Normal)
        {
            throw new Exception("Cannot create a normal CalcNumber without a value");
        }
        Status = status;
        Value = 0;
    }
}
public enum CalcNumberStatus 
{
    Normal,
    Error
}

如果需要,你甚至可以做一些花哨的运算符重载,以便于转换和算术。

关于精度问题,因为听起来你不打算对这个数字做算术,所以你不应该遇到妨碍等式检查工作的精确问题。

答案 3 :(得分:1)

如果您想要“特殊”值,我的建议是使用Nullable代替:

double? val = ...;

if(val.HasValue)
    // do something with val.Value

答案 4 :(得分:0)

我不认为这应该是个问题。我没有技术解释,但我已经多次使用MaxValue或MinValue进行比较,这从来都不是问题。