[英]Why does a very big double input return “Infinity” instead of error in Java?
初始化值大于1E309
的double变量会在编译过程中产生错误。 但是,将该值作为输入不会产生任何错误。 实际上,打印double变量将给出String
"Infinity"
。 为什么会这样?
import java.util.Scanner;
public class BigDouble {
public static void main(String[] args) {
double number;
Scanner keyboard = new Scanner(System.in);
System.out.print("Enter a number: ");
number = keyboard.nextDouble();
System.out.println(number);
}
}
您没有得到任何错误,因为nextDouble()
解析了Double
而不是double
。 Double
作为包装器类,具有几个有用的常量:
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
public static final double NaN = 0.0d / 0.0;
在内部, nextDouble()
使用Double.parseDouble(String)
提供结果,而不管输入的数字位于什么范围内。
public double nextDouble() {
...
try {
return Double.parseDouble(processFloatToken(next(floatPattern())));
} catch (NumberFormatException nfe) {
...
}
}
如果该数字超出double
范围,则将为您提供POSITIVE_INFINITY
或NEGATIVE_INFINITY
。
"NaN" -> Double.parseDouble("NaN") -> Double.NaN -> NaN
"1E6000" -> Double.parseDouble("1E6000") -> Double.POSITIVE_INFINITY -> Infinity
当您说“初始化一个值大于1E309
的双1E309
变量”时,您可能会表示:
double number = 1E6000;
在此,按原样显示的“ 1E6000”称为“文字”值。 您正在编写一个程序,并要求它按字面意义将此值用作double。
由于该值太大,这是不可能的。 因此,让您这样做是没有意义的。 相反,请使用可以实际表示的值,或者如果要使用无穷大,请使用常量Double.POSITIVE_INFINITY。 拒绝原义的1E6000不会使您失去任何选择。
但是,当您处理的不是字面值,而是某些计算的结果时,则浮点数的常见约定是,如果计算的值太大而无法表示,则可以提供无穷大来表示它。 没错。
在这里,程序员无法预测用户输入的数字太大而无法准确表示。 没有什么比将结果计算出的值表示为无穷大更好的选择了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.