为什么表达式(double.MinValue< double.MinValue + 1)返回false?

时间:2017-09-20 19:58:35

标签: java c# .net

考虑以下代码中的c#:

public class Program
{
    public static void Main(string[] args)
    {
        //Your code goes here
        Console.WriteLine(double.MinValue < double.MinValue + 1);
        Console.WriteLine(int.MinValue < int.MinValue + 1);
    }
}

输出将是:

False
True

我知道

Console.WriteLine(double.MinValue + 1);
Console.WriteLine(double.MinValue);

将打印相同的-1,79769313486232E+308值。

我的问题是:为什么这种“意外”和奇怪的行为发生了?我希望第一行也返回true

例如,下面的Java程序返回预期的true

public class MyClass {
    public static void main(String args[]) {
        System.out.println(Double.MIN_VALUE < Double.MIN_VALUE + 1);
    }
}

为什么会出现这种不同的行为?

2 个答案:

答案 0 :(得分:11)

两分钟的值是不同的东西。

在Java中,MIN_VALUE是最小 double值的名称。在C#中,MinValue是double值的名称,小于所有其他有限值;在Java中,该值为-Double.MAX_VALUE

而且这个价值非常消极,因此在舍入中添加1会丢失。 double没有足够的精确度来表示MinValueMinValue+1的区别。它大概是-1800000 .... 00,其中有 307 零。 double只能表示大约17个十进制数字的精度。因此,在舍入中添加一个会丢失。

答案 1 :(得分:1)

虽然Java和C#都实现了浮点计算的IEEE 754规范,但是最小值常量并不相同。

  • 在Java中,它是最小的值(Java doc
  • 在C#中,它是最小值(C# doc

你可以在这里尝试发生的事情(或者说“不会发生”):http://weitz.de/ieee/