Java输出给我"Infinity"

3
我写的Java程序输出为"Infinity",但我应该得到一个数字。我使用的是float类型,我不认为我的数字超出了float可以处理的范围。
我的问题是:当Java计算的值大于所使用的数据类型的处理范围时,我是否会获得"Infinity"作为输出?或者只有在我无意中除以零时才返回"Infinity"?

当然,您可以从超出范围的值中获得无穷大 - 例如尝试重复将数字乘以2。 - jasonharper
但是,如果你反复将一个数字乘以2,你永远不会达到无穷大。你只会得到一个非常大的数字,而你的变量数据类型无法处理它。 - Inertial Ignorance
可能是Java中的INFINITY常量到底是什么?的重复。 - John Coleman
3个回答

7

JLS明确回答了这个问题。

浮点运算溢出会产生一个有符号的无穷大。

你可能在某处进行了除以零的操作,但你可以进行检查。

double b = 1.1*Double.MAX_VALUE;
System.out.println(b);

这会显示为无穷大。


“overflows”是否意味着它达到了浮点数无法处理的太大的数字?然后Java输出“Infinity”作为结果? - Inertial Ignorance
我编辑了答案并加入了一个例子。是的,如果数字太大,它将变成无穷大。如果它太大且为负数,则会变成负无穷大。 - matt
太好了,谢谢。所以我可能得到“Infinity”,是因为我在除以零,或者是因为我计算的值对于float类型来说太大了? - Inertial Ignorance

2
请参考thedayofcondor在这里的答案:Java中的INFINITY常量到底是什么? 当您的操作超出float范围时,默认情况下会得到无限大的结果。正如您所说,无限大通常始于某个零除法或循环(或过大的)操作。如果您发布代码片段,我可以给您一个提示,告诉您它在哪里“不受保护”。
   Operation            Result
n ÷ ± Infinity           0
±Infinity × ±Infinity   ±Infinity
±nonzero  ÷ 0           ±Infinity
Infinity  + Infinity    Infinity
±0 ÷ ±0                 NaN
Infinity - Infinity     NaN
±Infinity ÷ ±Infinity   NaN
±Infinity × 0           NaN

2
根据Maximum value for Float in Java?,float类型的最大值是Float.MAX_VALUE。
在对float值进行除法运算时,您可能希望使用调试器进行一些简单的检查。或者,您可以在代码中添加日志语句。
Thread类提供了一个名为StackTraceElement的类。您可以使用它来查看哪个类/行号。
参考链接:https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace() https://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html 假设您有以下代码: float result = A / B; 每当您看到这样的代码时,您可以使用这个简单的打印语句:
float result = A / B;
System.out.format("Divisor: %d, Dividend: %d, result: %d", A, B, result);
// alternatively, add in the stack trace stuff.

一旦你找到罪魁祸首,原因可能非常明显。我的想法是,你可能将'B'的值初始化为0,但从未将其设置为你实际打算除以的浮点数。

java.util.IllegalFormatConversionException: d != java.lang.Float - Tamim Attafi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接