这是一个基本问题,但我找不到答案。我已经研究了浮点运算和其他一些主题,但似乎没有任何东西可以解决这个问题。我确定我的术语错了。
基本上,我想要两个数量 - 已完成,总数 - 并将它们分成一个百分比(已经完成了多少)。数量为long
s。这是设置:
long completed = 25000;
long total = 50000;
System.out.println(completed/total); // Prints 0
我尝试将结果重新分配给双 - 它打印0.0
。我哪里错了?
顺便提一下,下一步是将这个结果乘以100,我认为一旦这个小障碍被推翻就应该很容易。
顺便说一句,这里的作业不是普通的老字号(今天可能编码过多)。
答案 0 :(得分:123)
转换输出为时已晚;计算已经在整数运算中进行。您需要将输入转换为double
:
System.out.println((double)completed/(double)total);
请注意,您实际上不需要转换输入的两个。只要其中一个是double
,另一个将被隐式转换。但我喜欢两者兼顾,以保持对称性。
答案 1 :(得分:8)
你甚至不需要双打。只需乘以100 first 然后除以。否则结果将小于1并被截断为零,如您所见。
编辑:或者如果溢出可能,如果它会溢出(即股息大于922337203685477581),则将除数除以100。
答案 2 :(得分:3)
将completed
和total
转换为double
或至少在进行切换时将其转换为double
。即不仅仅是把结果变成了双倍的变速器。
公平警告,使用float
和double
时有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);