Java输出给我的是;“无限”;
我编写的一个Java程序的输出在我应该得到一个数字时给了我“无穷大”。我使用的是浮点数,我不认为我的数字超出了浮点数可以处理的范围Java输出给我的是;“无限”;,java,math,runtime-error,divide-by-zero,Java,Math,Runtime Error,Divide By Zero,我编写的一个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