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。
 转换completed和total double或者至less把它们double时,进行devision。 也就是说,把这些变数加倍,不仅仅是结果。 
 公平的警告,当使用float和double 精度时,存在浮点精度问题 。 
如果在分割之前没有明确地将这两个值中的一个赋值给一个浮点数,那么将使用整数除法(所以这就是为什么你得到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);