102

这是一个基本问题,但我找不到答案。我研究了浮点算术和其他一些主题,但似乎没有任何东西可以解决这个问题。我确定我只是用了错误的术语。

基本上,我想取两个数量 - 已完成和总计 - 并将它们划分为百分比(已完成的数量)。数量为longs。这是设置:

long completed = 25000;
long total = 50000;

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

我尝试将结果重新分配给 double - 它会打印0.0. 我哪里错了?

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

顺便说一句,这里不是家庭作业,只是简单的旧 numskull-ness(今天可能编码太多)。

4

7 回答 7

156

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

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

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

于 2011-08-28T11:35:27.420 回答
12

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

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

于 2011-08-28T12:08:27.660 回答
8
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 中的任何一个。

于 2016-07-14T18:02:48.963 回答
3

在进行划分时将两者都转换completedtotaldouble至少将它们转换为。double即,不仅使结果加倍,而且使变量加倍。

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

于 2011-08-28T11:36:34.550 回答
1

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

试试看

float completed = 50000.0f;

会好的。

于 2011-08-28T11:36:38.760 回答
1

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

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

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

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

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

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

long = int * int + long

int * int操作将导致 a int,它会在操作期间提升为longaint + long

于 2017-05-09T08:46:59.750 回答
-2

当您的输出结果是双倍时,您应该在除法时将完成的变量或总变量或两者都转换为双倍。

因此,正确的实现将是:

System.out.println((double)completed/total);
于 2017-08-20T04:44:41.033 回答