这个问题在这里已经有答案了:
整数除法:为什么1/3的结果==0((16个答案)
两年前关门了。
这是一个基本问题,但我找不到答案。我研究过浮点运算和其他一些主题,但似乎没有什么能解决这个问题。我肯定我只是用错了术语。
基本上,我想取两个数量-完成的,和总数-然后除以它们得出一个百分比(完成了多少)。数量为 long
s。设置如下:
long completed = 25000;
long total = 50000;
System.out.println(completed/total); // Prints 0
我已经试着把结果重新分配到一个双重的-它打印出来了 0.0
. 我哪里出错了?
顺便说一句,下一步是将这个结果乘以100,我假设一旦跨过这个小障碍,这应该很容易。
顺便说一句,这里没有家庭作业,只是简单的旧numskull ness(也许今天太多的代码)。
7条答案
按热度按时间uttx8gqw1#
两者转换
completed
以及total
至double
或者至少让他们double
在做除法的时候。i、 e.使变量加倍,而不仅仅是结果。公平警告,使用时存在浮点精度问题
float
以及double
.eivnm1vs2#
当您的输出结果是double时,您应该在除法时将completed变量或total变量或两者都转换为double。
因此,正确的实施方式是:
jjjwad0x3#
如果在除法之前没有将两个值中的一个显式转换为浮点值,那么将使用整数除法(这就是为什么得到0)。您只需要将两个操作数中的一个作为浮点值,这样就可以使用正除法(而另一个整数值则自动转换为浮点值)。
试试看吧
一切都会好起来的。
4sup72z84#
正如jls所解释的,整数运算非常简单。
如果除移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行该运算,并且数字运算符的结果为long类型。如果另一个操作数不长,则首先加宽它(§5.1.5)通过数字提升键入long(§5.6).
否则,该操作将使用32位精度执行,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其加宽为int类型。
所以简单来说,一次手术总是会导致
int
唯一的例外是long
它的价值。请注意,运算符的优先级很重要,因此如果
这个
int * int
操作将导致int
,它将被提升为long
手术期间int + long
7cwmlq895#
你甚至不需要双倍的。先乘以100,然后再除以。否则结果将小于1并被截断为零,如您所见。
编辑:或者如果可能溢出,如果它将溢出(即股息大于922337203685477581),则首先将除数除以100。
vnjpjtjt6#
转换输出太晚;已经用整数运算进行了计算。您需要将输入转换为
double
:请注意,实际上并不需要同时转换这两个输入。只要其中一个是
double
,另一个将被隐式转换。但为了对称,我更喜欢两者兼而有之。rggaifut7#
只需输入其中一个。