为什么是1/3 == 0的结果?

我正在写这个代码:

public static void main(String[] args) { double g = 1 / 3; System.out.printf("%.2f", g); } 

结果是0.为什么这个,我该如何解决这个问题?

两个操作数(1和3)是整数,因此使用整数运算(在此除法)。 将结果variables声明为double只会导致除法之后的隐式转换。

当然,整数除法返回到零的真实结果。 0.333...的结果因此在此舍入到0。 (请注意,处理器实际上并没有做任何舍入,但是你仍然可以这么想。)

另外请注意,如果两个操作数(数字)都是以浮点forms给出的, 3.0和1.0,甚至只是第一个 ,然后使用浮点运算,给你0.333...

1/3整数除法,因为两边都是整数。

你至less需要其中一个是floatdouble

如果你在你的问题中input源代码的值,你可以做1.0/3 ; 1.0是双倍的。

如果从其他地方获得值,则可以使用(double)int转换为double

 int x = ...; int y = ...; double value = ((double) x) / y; 

明确地将其转换为double

 double g = 1.0/3.0 

发生这种情况是因为Java使用13的整数除法操作,因为您将其作为整数常量input。

你应该使用

 double g=1.0/3; 

要么

 double g=1/3.0; 

整数除法返回整数。

1和3是整数,所以Java做一个整数除法,结果是0.如果你想写双常数,你必须写1.03.0

因为它将1和3视为整数,因此将结果舍入为0,以便它是一个整数。

为了得到你正在寻找的结果,明确告诉java,数字是双打的,就像这样:

 double g = 1.0/3.0; 

因为你在做整数除法。

正如@Noldorin所说,如果两个运算符都是整数,则使用整数除法。

结果0.33333333不能表示为整数,因此只有整数部分(0)被分配给结果。

如果任何一个操作符是double / float ,那么浮点运算就会发生。 但是如果你这样做,你会遇到同样的问题:

 int n = 1.0 / 3.0; 

许多人没有指出真正的问题:

仅对整数进行操作会将操作的结果转换为整数。

这一定意味着浮点结果, 可以显示为一个整数,将被截断(小数部分)。

什么是铸造 (types转换/types转换)你问?

不同语言的实施情况有所不同,但维基百科有一个相当全面的观点,而且它也提到强制问题 ,这是回答你的问题的关键信息。

http://en.wikipedia.org/wiki/Type_conversion

在JAVA中的转换很简单,但需要一些理解。 正如在JLS中对整数运算的解释一样:

如果移位运算符以外的整数运算符至less有一个longtypes的操作数,则该操作使用64位精度执行,数值运算符的结果为longtypes。 如果另一个操作数不是很长,则首先将其扩展(§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也不是那么容易:

 short s = 1; s = s + s; <- Compiling error //possible loss of precision // required: short // found: int 

这将需要一个可能损失精度的铸件。

浮点运算符也是如此

如果数值运算符的至less一个操作数是doubletypes的,则使用64位浮点运算执行操作,数值运算符的结果是doubletypes的值。 如果另一个操作数不是double,则首先将其扩展(第5.1.5节),以通过数字提升(第5.6节)键入double。

所以晋升是在浮动的情况下进行的。

如上所述,整数和浮点值的混合产生浮点值

如果至less有一个二元运算符的操作数是浮点types的,则操作是浮点运算,即使另一个是整数。

对于二元运算符而言,这是正确的,但不适用于“赋值运算符”,如+=

一个简单的例子就足以certificate这一点

 int i = 1; i += 1.5f; 

原因是在这里做了一个隐式的转换,这会被执行

 i = (int) i + 1.5f i = (int) 2.5f i = 2 

(1/3)表示整数除法,这就是为什么你不能从这个分区得到十进制值。 要解决这个问题使用:

 public static void main(String[] args) { double g = 1.0 / 3; System.out.printf("%.2f", g); } 

做“双g = 1.0 / 3.0;” 代替。

使1浮动和浮动部门将被使用

 public static void main(String d[]){ double g=1f/3; System.out.printf("%.2f",g); }