Java中的整数除法[重复]
Posted
技术标签:
【中文标题】Java中的整数除法[重复]【英文标题】:Division of integers in Java [duplicate] 【发布时间】:2011-08-28 11:34:14 【问题描述】:这是一个基本问题,但我找不到答案。我研究了浮点算术和其他一些主题,但似乎没有任何东西可以解决这个问题。我确定我只是用了错误的术语。
基本上,我想取两个数量 - 已完成和总计 - 并将它们除以得出一个百分比(已完成的数量)。数量为long
s。这是设置:
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 - 我不确定你在问什么。如果num1
和num2
是正整数,那么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】:在进行分解时将completed
和total
都转换为double
或至少将它们转换为double
。 IE。将变量转换为双倍而不仅仅是结果。
公平警告,使用 float
和 double
时会出现 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中的整数除法[重复]的主要内容,如果未能解决你的问题,请参考以下文章