提问人:Ben 提问时间:8/28/2011 最后编辑:Ben 更新时间:11/10/2018 访问量:271431
Java 中的整数除法 [重复]
Division of integers in Java [duplicate]
问:
这是一个基本问题,但我找不到答案。我已经研究了浮点运算和其他一些主题,但似乎没有解决这个问题。我敢肯定我只是用错了术语。
基本上,我想取两个数量 - 已完成和总计 - 并将它们除以得出百分比(已完成的数量)。数量为 s。设置如下:long
long completed = 25000;
long total = 50000;
System.out.println(completed/total); // Prints 0
我试过将结果重新分配给双精度 - 它打印.我哪里出错了?0.0
顺便说一句,下一步是将这个结果乘以 100,我认为一旦跨过这个小障碍,这应该很容易。
顺便说一句,这里不是家庭作业,只是普通的老头骨(今天可能编码太多了)。
答:
转换输出为时已晚;计算已经以整数算术进行。您需要将输入转换为:double
System.out.println((double)completed/(double)total);
请注意,您实际上并不需要转换这两个输入。只要其中一个是,另一个就会被隐式转换。但为了对称,我更喜欢两者兼而有之。double
评论
num1
num2
num1 / num2
Math.floor(num1 / num2)
在进行设计时,将两者转换为或至少将它们转换为。即,将变量转换为双倍,而不仅仅是结果。completed
total
double
double
公平警告,使用 和 时存在浮点精度问题。float
double
如果你在进行除法之前没有将两个值中的一个显式转换为浮点数,那么将使用整数除法(所以这就是你得到 0 的原因)。您只需要两个操作数中的一个是浮点值,以便使用正态除法(其他整数值会自动转换为浮点数)。
试试吧
float completed = 50000.0f;
一切都会好起来的。
你甚至不需要替身。只需先乘以 100,然后再除。否则,结果将小于 1 并被截断为零,如您所见。
编辑:或者,如果可能溢出,如果会溢出(即被除数大于 922337203685477581),请先将除数除以 100。
评论
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 中的任何一个即可。
正如 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
该操作将导致 ,它将在操作期间被提升为 Aint * int
int
long
int + long
由于输出结果为 double,因此在除法时,应将 completed 变量或总变量或两者强制转换为 double。
因此,正确的实现将是:
System.out.println((double)completed/total);
上一个:计算字符串中的数学表达式
下一个:列出 N 以下所有素数的最快方法
评论