我遇到了以下两个代码。为什么它不会为浮点引发异常,而在其他情况下它会引发运行时异常。
class FloatingPoint
{
public static void main(String [] args)
{
float a=1000f;
float b=a/0;
System.out.println("b=" +b);
}
}
输出:B =无限
如果我尝试使用int值,那么它将抛出一个运行时异常。 为什么会这样?
答案 0 :(得分:12)
简短回答
整数类型(JLS 4.2.1)与浮点类型(JLS 4.2.3)明显不同。在行为和操作方面可能存在相似之处,但也存在区别性差异,使两者混淆可能导致许多陷阱。
除以零时的行为差异只是这些差异中的一个。因此,简短的回答是Java的行为方式是因为语言是这样说的。
整数类型的值是以下范围内的整数:
byte
:从-128
到127
,包括[-2
7
, 2
7
-1]
short
:从-32768
到32767
,包括[-2
15
, 2
15
-1]
int
:从-2147483648
到2147483647
,包括[-2
31
, 2
31
-1]
long
:从-9223372036854775808
到9223372036854775807
,包括[-2
63
, 2
63
-1]
char
,从'\u0000'
到'\uffff'
,包括0
到65535
,即[0, 2
{{ 1}} 16
浮点类型为-1]
和float
,它们在概念上与单精度32位和双精度64位格式IEEE 754值和运算相关联。
从最小到最大,它们的值按如下顺序排列:
double
),此外,还有一些特殊的 Not-a-Number (0.0 == -0.0
)值,这些值是无序的。这意味着如果其中一个(或两个!)操作数都是NaN
:
NaN
,<
,<=
和>
返回>=
false
返回==
false
返回!=
当且仅当true
为x != x
时,true
为x
。
例如NaN
,无穷大和double
可以称为:
情况类似于NaN
和Float
。
在这些情况下,数值运算只能抛出float
:
Exception
,如果需要对NullPointerException
引用进行拆箱转换null
,如果整数除法/余数操作的右侧为零ArithmeticException
,如果需要装箱转换且内存不足关于陷阱的常见来源,它们按重要性排序。一般来说:
OutOfMemoryError
对于整数操作:
null
对于浮点操作:
ArithmeticException
或NaN
,则结果为0
。NaN
所有浮点运算的一般规则如下:
NaN
。NaN
作为操作数的所有数字操作都会产生NaN
。这个已久的答案还没有涉及很多问题,但鼓励读者浏览相关问题和参考资料。
答案 1 :(得分:11)
因为浮动实际上 表示你想要计算的“数字”。所以它使用它。整数没有这样的表示。
Java(主要)遵循IEEE754的浮点支持,有关详细信息,请参阅here。
答案 2 :(得分:2)
这是因为整数运算总是包装它的结果,除了(除法/余数为零)的情况。
在浮动的情况下,当存在溢出或下溢时,包裹变为0,无穷大或NaN
在溢流期间,它给出无穷大,在下溢期间,它给出了0.
再次有积极的&amp;负溢出/下溢。
尝试:
float a = -1000;
float b = a/0;
System.out.println("b=" +b);
这会产生负溢出
输出
B = -Infinity
同样,正下溢将导致0和负下溢-0
某些操作也可能导致通过float / double返回NaN(非数字)
例如:
float a = -1000;
double b = Math.sqrt(a);
System.out.println("b=" +b);
B = NaN的
答案 3 :(得分:1)
它是用于表示/通过零值的编程和数学标准。 float支持在JAVA中表示这些值。 int(整数)数据类型无法在JAVA中表示相同的内容。
检查: