考虑以下代码中的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);
}
}
为什么会出现这种不同的行为?
答案 0 :(得分:11)
两分钟的值是不同的东西。
在Java中,MIN_VALUE
是最小正 double
值的名称。在C#中,MinValue
是double值的名称,小于所有其他有限值;在Java中,该值为-Double.MAX_VALUE
。
而且这个价值非常消极,因此在舍入中添加1
会丢失。 double
没有足够的精确度来表示MinValue
与MinValue+1
的区别。它大概是-1800000 .... 00,其中有 307 零。 double
只能表示大约17个十进制数字的精度。因此,在舍入中添加一个会丢失。
答案 1 :(得分:1)
虽然Java和C#都实现了浮点计算的IEEE 754规范,但是最小值常量并不相同。
你可以在这里尝试发生的事情(或者说“不会发生”):http://weitz.de/ieee/