繁体   English   中英

为什么很大的双输入会返回“ Infinity”而不是Java中的错误?

[英]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_INFINITYNEGATIVE_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM