Java中整数的除法

109

这是一个基本问题,但我找不到答案。我已经研究了浮点算术和其他一些主题,但似乎没有解决这个问题。我确定我只是用词不当。

基本上,我想要取两个量 - 已完成的和总数 - 并将它们除以来得出一个百分比(已完成的比例)。这些量是 long 类型的。下面是设置:

long completed = 25000;
long total = 50000;

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

我尝试将结果重新分配给一个double - 它打印出0.0。我做错了什么?

顺便说一下,下一步是将这个结果乘以100,我认为一旦跨过这个小障碍就应该很容易了。

顺便说一句,这不是作业,只是普通的笨拙(也许今天编码太多了)。


2
你尝试过将(double)completed / (double)total...的结果赋值给一个double吗? - Sagar V
7个回答

166

在输出结果时进行转换已经太晚了;因为计算过程中已经使用整数算术了。你需要将输入值转换为 double 类型:

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

请注意,您实际上不需要同时转换两个输入。只要其中一个是double,另一个就会被隐式转换。但出于对称性的考虑,我更喜欢同时转换两个。


Java中是否有一个关键字可以用来除两个数字,例如' Math.floorDiv(num1,num2)'。 - Rudra
@Rudra - 我不确定你在问什么。如果num1num2是正整数,那么num1 / num2会给你想要的结果。否则,就是Math.floor(num1 / num2) - Oliver Charlesworth

13
你甚至不需要使用双精度浮点数。只需先乘以100,然后再除以100即可。否则结果将小于1并截断为零,就像你看到的那样。
编辑:如果可能会溢出,即被除数大于922337203685477581,那么请先将除数除以100。

1
只是为了明确:结果会被四舍五入还是向零取整?这是很大的区别。 - klaar
使用double会打印出类似于20.0的东西,而使用上述方法则会打印出纯粹的20。这是我情况下最好、最简单的解决方案。 - rainer

9
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

只需对它们中的任何一个进行类型转换即可。


3
completedtotal都转换为double,或者在进行除法运算时至少将它们强制转换为double。即将变量转换为double而不仅仅是结果。

请注意,在使用floatdouble时存在浮点精度问题


1
如果在执行除法之前,您没有将两个值中的一个显式转换为浮点数,则会使用整数除法(因此您会得到0)。 您只需要将其中一个操作数设置为浮点值,以便使用常规除法(并且其他整数值会自动转换为浮点数)。
请尝试使用:
float completed = 50000.0f;

这样做就可以了。


1
根据JLS的解释,整数运算非常简单。如果整数运算除移位操作外的至少一个操作数为long类型,则使用64位精度进行计算,数值运算结果为long类型。如果另一个操作数不是long类型,则通过数字提升将其先扩展(§5.1.5)为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 操作时会被提升为一个 long


-2

由于您的输出结果是一个双精度浮点数,因此在除法运算时应将completed变量或total变量或两者都转换为双精度浮点数。

因此,正确的实现方式如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接