我已经搜索了关于这个主题的不同问题,但没有一个明确的想法。检查此代码:
class Test{
public static void main(String[] s){
int a=5;
float b=(float)a/0;
System.out.print(b);
}
}
输出是Infinity
。但我没有得到的a
是一个int
并且a/0
必须抛出一个异常。那么它如何显示输出Infinity
呢?
我已经搜索了关于这个主题的不同问题,但没有一个明确的想法。检查此代码:
class Test{
public static void main(String[] s){
int a=5;
float b=(float)a/0;
System.out.print(b);
}
}
输出是Infinity
。但我没有得到的a
是一个int
并且a/0
必须抛出一个异常。那么它如何显示输出Infinity
呢?
原因是
(float)a/0;
被解释为
((float)a)/0;
并不是
(float)(a/0);
所以你实际上是在进行除法之前转换a
为 a float
,而不是进行整数除法然后转换结果。
希望这可以帮助!
您不是将整数除以零。您将 afloat
除以零,因为您的表达式等效于:
float b=((float)a)/0;
如果您强制除法仅使用整数进行,如以下示例所示,则将抛出预期的ArithmeticException
。
float b=(float)(a/0);
所有浮点计算都遵循 IEEE 754 规范。特别是,有三个特殊的浮点值来表示溢出和错误:
• 正无穷大 • 负无穷大 • NaN(不是数字)
例如,正数除以 0 的结果是正无穷大。计算 0/0 或负数的平方根会产生 NaN。
也可以看看
注意:浮点数不适用于不能容忍舍入误差的财务计算。例如,命令 System.out.println(2.0 - 1.1) 打印 0.8999999999999999,而不是您期望的 0.9。这种舍入误差是由浮点数在二进制数系统中表示的事实引起的。分数 1/10 没有精确的二进制表示,就像十进制系统中分数 1/3 没有精确的表示一样。如果您需要精确的数值计算而没有舍入误差,请使用本章稍后介绍的 BigDecimal 类。
来自核心 Java 第 1 卷第 3 章
a 是一个 int,除非在除法发生时将其转换为浮点数。请注意,演员表的优先级高于除法 - 为清楚起见,使用括号将是:
float b = ((float) a)/0;
因此,虽然 a 是一个 int,但您正在进行浮点除法。
这是因为 Java 不允许用int
s 除以零,而它允许用浮点值除。
Infinity
如果浮点运算创建的浮点数如此之大以至于无法正常表示,则会产生。
cast to float of也会a
自动生成0
to float
因为您要转换a
为浮点数,然后除以零。浮点数具有 +/- 无穷大。
http://www.velocityreviews.com/forums/t137207-division-by-zero-float-vs-int.html
二元 / 运算符执行除法,产生其操作数的商。左边的操作数是被除数,右边的操作数是除数。
整数除法向 0 舍入。也就是说,在二进制数值提升(第 5.6.2 节)之后为整数的操作数 n 和 d 产生的商是一个整数值 q,其幅值尽可能大,同时满足 |d·q||。 n|; 此外,当 |n||d| 时 q 为正 和 n 和 d 具有相同的符号,但当 |n||d| 时 q 为负 n 和 d 符号相反。有一种特殊情况不满足此规则:如果被除数是其类型的最大可能量级的负整数,并且除数为-1,则发生整数溢出并且结果等于被除数。尽管溢出,在这种情况下不会抛出异常。另一方面,如果整数除法中除数的值为 0,则抛出 ArithmeticException。
浮点除法的结果由 IEEE 算术规范确定:
If either operand is NaN, the result is NaN.
If the result is not NaN, the sign of the result is positive if both operands have the same sign, negative if the operands have different signs.
Division of an infinity by an infinity results in NaN.
Division of an infinity by a finite value results in a signed infinity. The sign is determined by the rule stated above.
Division of a finite value by an infinity results in a signed zero. The sign is determined by the rule stated above.
Division of a zero by a zero results in NaN; division of zero by any other finite value results in a signed zero. The sign is determined by the rule stated above.
Division of a nonzero finite value by a zero results in a signed infinity. The sign is determined by the rule stated above.
In the remaining cases, where neither an infinity nor NaN is involved, the exact mathematical quotient is computed. A floating-point value set is then chosen:
If the division expression is FP-strict (§15.4):
If the type of the division expression is float, then the float value set must be chosen.
If the type of the division expression is double, then the double value set must be chosen.
If the division expression is not FP-strict:
If the type of the division expression is float, then either the float value set or the float-extended-exponent value set may be chosen, at the whim of the implementation.
If the type of the division expression is double, then either the double value set or the double-extended-exponent value set may be chosen, at the whim of the implementation.
Next, a value must be chosen from the chosen value set to represent the quotient. If the magnitude of the quotient is too large to represent, we say the operation overflows; the result is then an infinity of appropriate sign. Otherwise, the quotient is rounded to the nearest value in the chosen value set using IEEE 754 round-to-nearest mode. The Java programming language requires support of gradual underflow as defined by IEEE 754 (§4.2.4).
尽管可能发生上溢、下溢、被零除或信息丢失,但浮点除法运算符 / 的求值永远不会引发运行时异常。
这可以在以下位置进行验证:http ://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.17.2