为什么是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需要其中一个是float
或double
。
如果你在你的问题中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使用1
和3
的整数除法操作,因为您将其作为整数常量input。
你应该使用
double g=1.0/3;
要么
double g=1/3.0;
整数除法返回整数。
1和3是整数,所以Java做一个整数除法,结果是0.如果你想写双常数,你必须写1.0
和3.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转换)你问?
不同语言的实施情况有所不同,但维基百科有一个相当全面的观点,而且它也提到强制问题 ,这是回答你的问题的关键信息。
在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); }