可以询问浮动...或MinValue的相同问题。
我正在考虑将其用作特殊值。我会看到精确的错误吗?我不希望用这些数字算术,只需设置它们即可。
澄清:我使用它来获得哨兵价值。
是否在C#规范中描述了什么?
答案 0 :(得分:10)
这取决于你如何使用它。
如果你使用double.MaxValue
作为具有特殊语义的标记或标记值,那么是的,它只是你要比较的一点模式。例如,您可以使用double.MaxValue
来表示“未初始化”或“未知”值。还有其他方法可以做到这一点(例如,使用可空的double?
),但使用double.MaxValue
也是合理的,假设您的域中不会自然出现该值。
如果你有一些任意的double
值,并且你想看看它是否与double.MaxValue
“相等”,那么你会想看看这些数字是否在一个小范围内(因为在计算其他double
值时某些精度可能会丢失,所以彼此之间存在差异。要注意的问题是值超出double.MaxValue
,会产生溢出情况。
答案 1 :(得分:2)
如果您将double.MaxValue
与double.MaxValue
进行比较,那么它们将是相同的。二进制表示是相同的,不会有问题。另一方面,如果你尝试类似的东西:
double myDouble = (double.MaxValue - 3.1415) / 2;
if((myDouble * 2) + 3.1415 == double.MaxValue)
{
...
}
然后是的,你可能会开始看到弹出奇怪的精度问题。
以下是无法与自身进行比较的特殊常量。其他任何事都是合理的游戏。
答案 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进行比较,这从来都不是问题。