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);