Java 中的整数除法 [重复]

Division of integers in Java [duplicate]

提问人:Ben 提问时间:8/28/2011 最后编辑:Ben 更新时间:11/10/2018 访问量:271431

问:

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

基本上,我想取两个数量 - 已完成和总计 - 并将它们除以得出百分比(已完成的数量)。数量为 s。设置如下:long

long completed = 25000;
long total = 50000;

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

我试过将结果重新分配给双精度 - 它打印.我哪里出错了?0.0

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

顺便说一句,这里不是家庭作业,只是普通的老头骨(今天可能编码太多了)。

Java 数学 浮点 长整数 println

评论

2赞 Sagar V 8/28/2011
您是否尝试过(双)完成/(双)总...然后将结果分配给双精度?

答:

166赞 Oliver Charlesworth 8/28/2011 #1

转换输出为时已晚;计算已经以整数算术进行。您需要将输入转换为:double

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

请注意,您实际上并不需要转换这两个输入。只要其中一个是,另一个就会被隐式转换。但为了对称,我更喜欢两者兼而有之。double

评论

0赞 Rudra 1/4/2016
java 中是否有任何关键字可以除以两个数字,例如“Math.floorDiv(num1,num2)”
0赞 Oliver Charlesworth 1/5/2016
@Rudra - 我不确定你在问什么。如果 和 是正整数,则为您提供所需的内容。否则,它只是.num1num2num1 / num2Math.floor(num1 / num2)
3赞 Ali 8/28/2011 #2

在进行设计时,将两者转换为或至少将它们转换为。即,将变量转换为双倍,而不仅仅是结果。completedtotaldoubledouble

公平警告,使用 和 时存在浮点精度问题floatdouble

1赞 Jack 8/28/2011 #3

如果你在进行除法之前没有将两个值中的一个显式转换为浮点数,那么将使用整数除法(所以这就是你得到 0 的原因)。您只需要两个操作数中的一个是浮点值,以便使用正态除法(其他整数值会自动转换为浮点数)。

试试吧

float completed = 50000.0f;

一切都会好起来的。

13赞 harold 8/28/2011 #4

你甚至不需要替身。只需先乘以 100,然后再除。否则,结果将小于 1 并被截断为零,如您所见。

编辑:或者,如果可能溢出,如果会溢出(即被除数大于 922337203685477581),请先将除数除以 100。

评论

1赞 klaar 3/11/2016
需要明确的是:结果是四舍五入还是下限为零?大不同。
0赞 rainer 4/13/2020
使用双打印可以打印出类似 20.0 的东西,使用上述方法可以打印普通的 20。就我而言,最好和最简单的解决方案。
9赞 Bhavya Jain 7/15/2016 #5
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

只需键入 cast 中的任何一个即可。

1赞 AxelH 5/9/2017 #6

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

如果移位运算符以外的整数运算符至少有一个 long 类型的操作数,则使用 64 位精度执行运算,并且数值运算符的结果为 long 类型。如果另一个操作数不长,则首先将其扩展 (§5.1.5) 以通过数字升级 (§5.6) 键入 long。

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

因此,简而言之,一个操作总是会导致一个唯一的例外,即其中有一个值。intlong

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

请注意,运算符的优先级很重要,因此,如果您有

long = int * int + long

该操作将导致 ,它将在操作期间被提升为 Aint * intintlongint + long

-2赞 taurz 8/20/2017 #7

由于输出结果为 double,因此在除法时,应将 completed 变量或总变量或两者强制转换为 double。

因此,正确的实现将是:

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