Java中的整数除法[重复]

Posted

技术标签:

【中文标题】Java中的整数除法[重复]【英文标题】:Division of integers in Java [duplicate] 【发布时间】:2011-11-05 10:44:41 【问题描述】:

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

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

long completed = 25000;
long total = 50000;

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

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

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

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

【问题讨论】:

您是否尝试过 (double)completed / (double) total ... 然后将结果分配给 double? 【参考方案1】:

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

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

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

【讨论】:

java中是否有任何关键字来划分两个数字,例如'Math.floorDiv(num1,num2)' @Rudra - 我不确定你在问什么。如果num1num2 是正整数,那么num1 / num2 会给你你想要的。否则,它只是Math.floor(num1 / num2)【参考方案2】:

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

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

【讨论】:

明确一点:结果会rounded 还是floored 为零?大不同。 使用双重打印类似 20.0,使用上述方法打印纯 20。就我而言,这是最好和最简单的解决方案。【参考方案3】:
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 中的任何一个即可。

【讨论】:

【参考方案4】:

在进行分解时将completedtotal 都转换为double 或至少将它们转换为double。 IE。将变量转换为双倍而不仅仅是结果。

公平警告,使用 floatdouble 时会出现 floating point precision problem。

【讨论】:

【参考方案5】:

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

试试看

float completed = 50000.0f;

会好的。

【讨论】:

【参考方案6】:

正如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

int * int 操作会产生一个int,它会在操作int + long 期间提升为一个long

【讨论】:

【参考方案7】:

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

所以,正确的实现是:

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

【讨论】:

以上是关于Java中的整数除法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在python中处理长整数除法[重复]

Python 2.x 中的除法 [重复]

整数除法总是零[重复]

Python 除法运算

VB.NET vs C#整数除法[重复]

java做除法运算,为啥除不开时也会得到整数呢