java中整数的数学除法

368yc8dk  于 2021-07-03  发布在  Java
关注(0)|答案(7)|浏览(336)

这个问题在这里已经有答案了

整数除法:为什么1/3的结果==0((16个答案)
两年前关门了。
这是一个基本问题,但我找不到答案。我研究过浮点运算和其他一些主题,但似乎没有什么能解决这个问题。我肯定我只是用错了术语。
基本上,我想取两个数量-完成的,和总数-然后除以它们得出一个百分比(完成了多少)。数量为 long s。设置如下:

long completed = 25000;
long total = 50000;

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

我已经试着把结果重新分配到一个双重的-它打印出来了 0.0 . 我哪里出错了?
顺便说一句,下一步是将这个结果乘以100,我假设一旦跨过这个小障碍,这应该很容易。
顺便说一句,这里没有家庭作业,只是简单的旧numskull ness(也许今天太多的代码)。

uttx8gqw

uttx8gqw1#

两者转换 completed 以及 totaldouble 或者至少让他们 double 在做除法的时候。i、 e.使变量加倍,而不仅仅是结果。
公平警告,使用时存在浮点精度问题 float 以及 double .

eivnm1vs

eivnm1vs2#

当您的输出结果是double时,您应该在除法时将completed变量或total变量或两者都转换为double。
因此,正确的实施方式是:

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

jjjwad0x3#

如果在除法之前没有将两个值中的一个显式转换为浮点值,那么将使用整数除法(这就是为什么得到0)。您只需要将两个操作数中的一个作为浮点值,这样就可以使用正除法(而另一个整数值则自动转换为浮点值)。
试试看吧

float completed = 50000.0f;

一切都会好起来的。

4sup72z8

4sup72z84#

正如jls所解释的,整数运算非常简单。
如果除移位运算符以外的整数运算符至少有一个long类型的操作数,则使用64位精度执行该运算,并且数字运算符的结果为long类型。如果另一个操作数不长,则首先加宽它(§5.1.5)通过数字提升键入long(§5.6).
否则,该操作将使用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

7cwmlq89

7cwmlq895#

你甚至不需要双倍的。先乘以100,然后再除以。否则结果将小于1并被截断为零,如您所见。
编辑:或者如果可能溢出,如果它将溢出(即股息大于922337203685477581),则首先将除数除以100。

vnjpjtjt

vnjpjtjt6#

转换输出太晚;已经用整数运算进行了计算。您需要将输入转换为 double :

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

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

rggaifut

rggaifut7#

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

只需输入其中一个。

相关问题