试图编写这个脚本,使用经常达数千亿的输入。但是,Math.ceil不会向上舍入?
int clayturns = (int)Math.ceil(clayneeded / 7500000000L);
System.out.println((int) Math.ceil(clayneeded / 7500000000L));
System.out.println("we need " + clayturns + "turns");
System.out.println("we need " + clayneeded + " clay added to our specific village.");
在这下我有eclipse控制台输出。正如你所看到的,clayneeded不是空白。好像就是这样,那么clayturns应该永远是某种东西,它不能是零,但它确实如此。
we need 0turns
we need 3021588634 clay needed to our specific village.
请让我知道你在想什么。数学是否适用于Longs?
是clayneeded
和int
/ long
?如果你正在做int
/ long
除法,它会在它到达Math.ceil
之前截断任何小数分量。考虑到输入的大小,我会远离float
s / double
s,并使用BigDecimal
s在这里准确地进行数学计算。
看起来像clayneeded
有整数类型(可能是long
)。所以clayneeded/7500000000L
是整数除法(商),因此ceil
计算整数的上限,所以本身。
所以你可以像这样计算它(如果整数除法的余数不是nul那么上限必须产生下一个整数):
long remainder = clayneeded % 7500000000L;
long result = (clayneeded/7500000000L)+(remainder!=0?1:0);
这是因为您将clayturns变量存储在整数内。发生Integer溢出,返回0。
整数的最大值为+2,147,483,647。