Answers:
两个操作数(1和3)是整数,因此使用整数算术(此处为除法)。将结果变量声明为double只会导致除法后发生隐式转换。
当然,整数除法会返回除法四舍五入的真实结果。因此,0.333...
此处的结果四舍五入为0。(请注意,处理器实际上不进行任何舍入,但您仍然可以这样考虑。)
另外,请注意,如果两个操作数(数字)均以浮点数给出;3.0和1.0,甚至只是第一个,然后使用浮点运算,就可以得到0.333...
。
你应该使用
double g=1.0/3;
要么
double g=1/3.0;
整数除法返回整数。
JAVA中的转换非常简单,但是需要一些理解。如JLS中关于整数运算的说明:
如果除移位运算符以外的整数运算符至少具有一个long类型的操作数,则使用64位精度执行该运算,并且数值运算符的结果为long类型。如果另一个操作数不长,则首先将其扩展(第5.1.5节)以通过数字提升(第5.6节)键入long。
一个例子永远是翻译JLS的最佳方法;)
int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)
否则,将使用32位精度执行运算,并且数值运算符的结果为int类型。如果任何一个操作数都不是int,则首先通过数值提升将其扩展为int类型。
short + int -> int + int -> int
一个使用Eclipse的小例子表明,即使加上两个short
s也不是那么容易:
short s = 1;
s = s + s; <- Compiling error
//possible loss of precision
// required: short
// found: int
这将要求铸造,可能会损失精度。
浮点运算符也是如此
如果数字运算符的至少一个操作数是double类型的,则使用64位浮点算术执行该运算,并且数字运算符的结果是double类型的值。如果另一个操作数不是双精度数,则首先将其扩展(第5.1.5节)以通过数字提升(第5.6节)键入double。
因此,晋升就完成了两次。
整数和浮点值的混合导致浮点值,如所述
如果二进制运算符中的至少一个操作数是浮点类型的,则该运算是浮点运算,即使另一个是整数也是如此。
对于二进制运算符,这是正确的,但对于“赋值运算符”(例如 +=
一个简单的工作示例足以证明这一点
int i = 1;
i += 1.5f;
原因是这里执行了隐式转换,这将像
i = (int) i + 1.5f
i = (int) 2.5f
i = 2
最简单的解决方案是执行此操作
double g = ((double) 1 / 3);
既然您没有输入1.0 / 3.0,它所做的就是让您手动将其转换为double类型的数据类型,因为Java假定它是Integer除法,即使它意味着缩小转换范围,它也会这样做。这就是所谓的强制转换运算符。
试试看:
public static void main(String[] args) {
double a = 1.0;
double b = 3.0;
double g = a / b;
System.out.printf(""+ g);
}
进行“ double g = 1.0 / 3.0;” 代替。
许多其他人未能指出真正的问题:
仅对整数进行的运算会将运算结果转换为整数。
这必然意味着浮点结果(可能显示为整数)将被截断(舍去小数部分)。
您要求的是转换(类型转换/类型转换)?
它在语言的实现上有所不同,但是Wikipedia具有相当全面的观点,并且也谈到了强制性,这是回答问题的关键信息。
1/2
,而不是目标语言(java)。您只需调用整数除法,即可得到整数结果。类型转换仅是因为在分配过程中从转换int
为double
。
0.5
。简单来说,在Java中1/2
是整数除法,结果为零整数。您可以为双精度数分配一个零,尽管它是一个0.0
双精度数,但仍将是一个零。
int i = .99999999
将int设置为0。更具体地说,它将整数部分并丢弃其余部分。