Java整数除法不';不要给负数留余地
我试着使用java的整数除法,据说它会占上风。然而,它向零而不是向地板旋转Java整数除法不';不要给负数留余地,java,integer,floor,Java,Integer,Floor,我试着使用java的整数除法,据说它会占上风。然而,它向零而不是向地板旋转 public class Main { public static void main(String[] args) { System.out.println(-1 / 100); // should be -1, but is 0 System.out.println(Math.floor(-1d/100d)); // correct } } 问题是我不想转换为双精度/
public class Main {
public static void main(String[] args) {
System.out.println(-1 / 100); // should be -1, but is 0
System.out.println(Math.floor(-1d/100d)); // correct
}
}
问题是我不想转换为双精度/浮点型,因为它需要高效。我试图用一种方法来解决这个问题,floorvide(长a,长b)
。我得到的是:
static long floorDivide(long a, long b) {
if (a < 0) {
// what do I put here?
}
return a / b;
}
静态长地板视频(长a、长b){
if(a<0){
//我在这里放什么?
}
返回a/b;
}
如果没有双精度浮点运算,我怎么做呢?取绝对值,除以它,再乘以-1 奇怪的虫子 您可以使用
int i = (int) Math.round(doubleValToRound);
它将返回一个double
值,您可以将该值转换为int
,而不会丢失精度,也不会出现性能问题(转换的计算成本不高)
也相当于
int a = (int) (doubleValToRound + 0.5);
//in your case
System.out.println((int) ((-1 / 100) + 0.5));
有了这最后一个,你就不必进入枯燥和不必要的“如果”指令。就像一套好衣服一样,它对任何时刻都有效,对其他语言具有更高的可移植性。这很难看,但满足了不使用双精度/浮点型的要求。真的,你应该把它投到一个双位 这里的逻辑是,如果整型除法不能平均除法,则从整型除法得到负结果
static long floorDivide(long a, long b)
{
if(a % b != 0 && ((a < 0 && b > 0) || (a > 0 && b < 0)))
{
return (a / b - 1);
}
else
{
return (a / b);
}
}
静态长地板视频(长a、长b)
{
如果(a%b!=0&&((a<0&&b>0)| |(a>0&&b<0)))
{
返回(a/b-1);
}
其他的
{
返回(a/b);
}
}
只需将这两个整数除以即可。然后在结果中加-1(如果分子和分母的绝对值不相同)。例如,-3/3给出了-1,这是正确的答案,而不需要在除法中加-1。来自Java.Math,这正是您想要的
返回小于或等于代数商的最大(最接近正无穷大)长值
因为有点晚了,但您需要将参数转换为long或double
int result = (int) Math.floor( (double) -1 / 5 );
// result == -1
这对我来说非常有用。正如弗兰克·哈珀所建议的,我会用在一般情况下
然而,请注意,当除数是2的幂时,除法通常由适当位数的右移位代替,即
x / d
与
x >> p
当p=0,1,…,30(或0,1,…,62表示长)时,d=2p,x为非负。这不仅比普通除法更有效,而且在x为负数时(从数学意义上讲)会给出正确的结果。将一个
整数
转换为双整数
并没有什么效率低下的地方。这不是一个错误,存在多种计算商/余数的方法。向-1四舍五入的是欧几里德除法,而Java使用的是截断除法。当我想要-1时,它给出0
x >> p