Java中整数的划分

这是一个基本的问题,但我找不到答案。 我研究过浮点算术和其他几个主题,但似乎没有解决这个问题。 我确定我只是有错误的术语。

基本上,我想采取两个数量 – 完成和总计 – 并将它们分成一个百分比(已完成多less)。 数量很long 。 这是设置:

 long completed = 25000; long total = 50000; System.out.println(completed/total); // Prints 0 

我尝试重新分配结果到一个双 – 打印0.0 。 我哪里错了?

顺便说一句,下一步是把这个结果乘以100,这个小跨度跨越后,我认为应该很容易。

顺便说一句,这里没有作业,只是普通的老式的数字(也许今天编码太多)。

转换输出为时已晚。 计算已经发生在整数运算中。 您需要将input转换为double

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

请注意,您实际上并不需要转换它们; 只要一个是double ,另一个就会被隐式转换。 但我更喜欢做这两个,为了对称。

你甚至不需要双打这个。 只需乘以100,然后分开。 否则,结果会小于1,并截断为零,如你所见。

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

转换completedtotal double或者至less把它们double时,进行devision。 也就是说,把这些变数加倍,不仅仅是结果。

公平的警告,当使用floatdouble 精度时,存在浮点精度问题 。

如果在分割之前没有明确地将这两个值中的一个赋值给一个浮点数,那么将使用整数除法(所以这就是为什么你得到0)。 您只需要两个操作数中的一个为浮点值,以便使用正常的除法(其他整数值会自动变成浮点数)。

试试吧

 float completed = 50000.0f; 

它会没事的

 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 

只要input其中任何一个。

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

如果移位运算符以外的整数运算符至less有一个longtypes的操作数,则该操作使用64位精度执行,数值运算符的结果为longtypes。 如果另一个操作数不是很长,则首先将其扩展(§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 ,在int + long操作过程中会int + long

由于你的输出结果是双倍的,所以你应该把完成的variables或者总的variables或者二者都转换成在分割时加倍

所以,正确的暗示将是:

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