Java输出给我的是;“无限”;

Java输出给我的是;“无限”;,java,math,runtime-error,divide-by-zero,Java,Math,Runtime Error,Divide By Zero,我编写的一个Java程序的输出在我应该得到一个数字时给了我“无穷大”。我使用的是浮点数,我不认为我的数字超出了浮点数可以处理的范围 我的问题是,如果Java计算的值大于使用中的数据类型所能处理的值,我会得到“无穷大”作为输出吗?或者“无穷大”只有在我在某个地方意外地被零除时才会返回。请参考这里的“康多夫之日”的答案: 当您的操作离开浮动范围时,默认情况下,您会得到无穷大。然而,正如你所说的,无穷大通常从某个地方的零除开始,或者从循环(或太大的)运算开始。如果你发布一段代码,我可以给你一个提示,告

我编写的一个Java程序的输出在我应该得到一个数字时给了我“无穷大”。我使用的是浮点数,我不认为我的数字超出了浮点数可以处理的范围


我的问题是,如果Java计算的值大于使用中的数据类型所能处理的值,我会得到“无穷大”作为输出吗?或者“无穷大”只有在我在某个地方意外地被零除时才会返回。

请参考这里的“康多夫之日”的答案:

当您的操作离开浮动范围时,默认情况下,您会得到无穷大。然而,正如你所说的,无穷大通常从某个地方的零除开始,或者从循环(或太大的)运算开始。如果你发布一段代码,我可以给你一个提示,告诉你哪里是“不受保护的”

   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
答案相当明确

溢出的浮点运算产生有符号无穷大

你可能在某处被零除,但你可以检查一下

double b = 1.1*Double.MAX_VALUE;
System.out.println(b);
它显示为无穷大。

是的,根据这个: 浮点可以具有的最大值是float.max_值

您可能希望在除法此浮点值时使用调试器进行一些简单的检查。或者,您可以在代码中添加日志语句

Thread类提供了一个名为StackTraceeElement的类。您可以使用它来查看哪个类别/行号

假设你有这样的东西:

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,但从不将其设置为实际要除以的浮点值。

当然,您可以从超出范围的值中获得无穷大-例如,尝试将数字重复乘以2。但是如果您将数字重复乘以2,则永远无法达到无穷大。你只会得到一个变量的数据类型无法处理的非常大的数字。可能的“溢出”重复是否意味着它达到了一个浮点无法处理的太大的数字?然后Java输出“无穷大”作为结果?我编辑了答案以包含一个示例。是的,如果这个数字太大,它将变成无穷大。如果它太大,它会变成负无穷大。太好了,谢谢。所以我可能得到“无穷大”,要么因为我被零除,要么因为我计算的值太大,浮点无法处理?java.util.IllegalFormatConversionException:d!=java.lang.Float