Java中的整数除法

时间:2011-08-28 11:34:15

标签: java math floating-point long-integer println

这是一个基本问题,但我找不到答案。我已经研究了浮点运算和其他一些主题,但似乎没有任何东西可以解决这个问题。我确定我的术语错了。

基本上,我想要两个数量 - 已完成,总数 - 并将它们分成一个百分比(已经完成了多少)。数量为long s。这是设置:

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0

我尝试将结果重新分配给双 - 它打印0.0。我哪里错了?

顺便提一下,下一步是将这个结果乘以100,我认为一旦这个小障碍被推翻就应该很容易。

顺便说一句,这里的作业不是普通的老字号(今天可能编码过多)。

7 个答案:

答案 0 :(得分:123)

转换输出为时已晚;计算已经在整数运算中进行。您需要将输入转换为double

System.out.println((double)completed/(double)total);

请注意,您实际上不需要转换输入的两个。只要其中一个是double,另一个将被隐式转换。但我喜欢两者兼顾,以保持对称性。

答案 1 :(得分:8)

你甚至不需要双打。只需乘以100 first 然后除以。否则结果将小于1并被截断为零,如您所见。

编辑:或者如果溢出可能,如果它会溢出(即股息大于922337203685477581),则将除数除以100。

答案 2 :(得分:3)

completedtotal转换为double或至少在进行切换时将其转换为double。即不仅仅是把结果变成了双倍的变速器。

公平警告,使用floatdouble时有floating point precision problem

答案 3 :(得分:2)

In Java
Integer/Integer = Integer
Integer/Double = Double//Either of numerator or denominator must be floating point number
1/10 = 0
1.0/10 = 0.1
1/10.0 = 0.1

只需输入其中任何一个。

答案 4 :(得分:1)

如果在进行除法之前没有将两个值中的一个显式地转换为浮点数,那么将使用整数除法(这就是为什么得到0)。您只需要将两个操作数中的一个作为浮点值,以便使用正常除法(并且其他整数值将自动转换为浮点数)。

试试

float completed = 50000.0f;

,没关系。

答案 5 :(得分:0)

正如JLS所解释的那样,整数运算非常简单。

  

如果移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行运算,并且数值运算符的结果为long类型。如果另一个操作数不长,则首先将其扩展(第5.1.5节)以通过数字提升(第5.6节)键入long。

     

否则,操作使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先将其扩展为通过数字提升键入int。

因此,为了简化操作,操作总是会导致int唯一的例外,即long值。

int = int + int
long = int + long
int = short + short

请注意,操作员的优先级很重要,因此如果您有

long = int * int + long

int * int操作会产生int,在操作long

期间会被提升为int + long

答案 6 :(得分:-2)

当您的输出结果为双倍时,您应该将完成变量或总变量或两者都转换为加倍,同时除以。

所以,正确的建议将是:

System.out.println((double)completed/total);