2011-08-28 80 views
70

这是一个基本问题,但我找不到答案。我研究过浮点算术和其他一些主题,但似乎没有解决这个问题。我相信我只是有错误的术语。Java中的整数部分

基本上,我要带两个量 - 完成,总 - 分和他们来了(多少已完成)的百分比。数量为long s。这里的设置:

long completed = 25000; 
long total = 50000; 

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

我试过的结果重新分配到双 - 它打印0.0。我哪里错了?

顺便说一下,下一个步骤是通过100乘以这个结果,我假设一旦这个小的障碍是跨过应该很容易。

顺便说一句,这里不是作业,只是普通的旧数字(可能今天编码太多)。

+2

你尝试(双)已完成/(双)总...,然后分配结果双? –

+2

尝试完成* 1.0 /总计 – user12384512

回答

106

转换的输出为时已晚;计算已经发生在整数运算中。你需要转换输入double

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

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

+0

Java中是否有任何关键字将两个数字相除**'Math.floorDiv(num1,num2)'** – Rudra

+0

@Rudra - 我不确定你在问什么。如果'num1'和'num2'是正整数,那么'num1/num2'会给你你想要的。否则,它只是'Math.floor(num1/num2)'。 –

3

都转换completedtotaldouble或至少做时等分它们转换成double。即投下的变数不仅仅是结果的两倍。

公平的警告,与floatdouble工作时有一个floating point precision problem

1

如果你没有做明确的划分,然后整数除法将使用(这就是为什么你会得到0)前投了两个值之一为float。您只需要将两个操作数中的一个设置为浮点值,以便使用正常的除法(其他整数值会自动转换为浮点数)。

float completed = 50000.0f; 

只要尝试,并会被罚款。

9

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

编辑:或者如果溢出是可能的,如果它会溢出(即被除数比922337203685477581更大),由100首先除以除数。

+0

只需要清楚:结果是否会舍入*或* floiled *为零?巨大差距。 – klaar

0
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 

只要输入其中任何一个。

0

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

如果比的变速操作者以外的整数运营商具有长型的至少一个操作数,则该操作被执行使用64位精度,数值运算符的结果是类型长的。如果另一个操作数不长,则首先扩展(§5.1.5)以通过数字提升键入long(§5.6)。

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

所以,使其短,操作总是导致int在唯一的例外是在它里面一个long值。

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

注意操作的优先级是很重要的,所以如果你有

long = int * int + long 

将导致intint * int操作,这将是在操作过程中促进成longint + long

-3

由于您的输出结果是双精度型,您应该在完成变量或总变量或两者的同时将其分成两部分。

所以,正确的implmentation将是:

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

是的,这就是六年前接受的答案。 –