我怎样才能始终将double
向int
舍入,而不是将其向下舍入。
我知道Math.round(double)
,但我希望它总是围捕。
因此,如果它是3.2
,则会四舍五入为4.
答案 0 :(得分:35)
您可以使用Math.ceil()
方法。
请参阅JavaDoc链接:https://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#ceil(double)
来自文档:
<强>小区强>
public static double ceil(double a)
返回大于或等于参数且等于数学整数的最小(最接近负无穷大)double值。特殊情况:
请注意,Math.ceil(x)的值正好是-Math.floor(-x)的值。
<强>参数:强>
<强>返回:强>
最大(最接近负无穷大)浮点值,该值大于或等于参数且等于数学整数。
答案 1 :(得分:8)
简单来说,
Math.ceil
将始终向上舍入或如上所述,过剩。 Math.round
将根据小数向上或向下舍入。
Math.ceil
和Math.round
的示例:
以下代码将返回:
成本,没有Ceil 2.2和Ceil 3(int),3.0(双)。如果我们围绕它:2
int m2 = 2200;
double rate = 1000.0;
int costceil = (int)Math.ceil(m2/rate);
double costdouble = m2/rate;
double costdoubleceil = Math.ceil(m2/rate);
int costrounded = (int)Math.round(m2/rate);
System.out.println("Cost, without Ceil "+costdouble+" and with Ceil "+
costceil+"(int), "+costdoubleceil+"(double). If we round it: "+costrounded);
如果我们将m2的值更改为例如 2499 ,则结果为:
成本,没有Ceil 2.499和Ceil 3(int),3.0(双)。如果我们围绕它:2
如果我们将m2的值更改为例如 2550 ,则结果为:
成本,没有Ceil 2.55和Ceil 3(int),3.0(双)。如果我们围绕它:3
希望它有所帮助。 (从以前的答案中提取的信息,我只是想让它更清楚)。
答案 2 :(得分:0)
private int roundUP(double d){
double dAbs = Math.abs(d);
int i = (int) dAbs;
double result = dAbs - (double) i;
if(result==0.0){
return (int) d;
}else{
return (int) d<0 ? -(i+1) : i+1;
}
}
干得好! ;)
答案 3 :(得分:0)
我的方法相对简单,希望它适合你。
在我的情况下,我有一排只能容纳3个物品的物品,我必须调整我必须容纳物品的行数。
所以我有一些Double numberOfRows,然后我使用numberOfRows.intValue()来获取numberOfRows的int值。
如果我获得的int值小于numberOfRows,我将numberOfRows加1以将其四舍五入,否则我从numberOfRows.intValue()得到的值就是我想要的答案。
我写了这个简单的for循环来测试它:
for(int numberOfItems = 0; numberOfItems < 16; numberOfItems++) {
Double numberOfRows = numberOfItems / 3.0;
System.out.println("Number of rows are: " + numberOfRows);
System.out.println("Number of items are: " + numberOfItems);
if(numberOfRows.intValue() < numberOfRows) {
System.out.println("int number of rows are: " + (numberOfRows.intValue() + 1));
}
else {
System.out.println("int value of rows are: " + numberOfRows.intValue());
}
System.out.println();
System.out.println();
}
答案 4 :(得分:0)
不使用 Math.ceil()的简短示例。
public double roundUp(double d){
return d > (int)d ? (int)d + 1 : d;
}
<强> Exaplanation:强> 使用类型转换将操作数与舍入操作数进行比较,如果更大的返回向下舍入参数+ 1(表示向上舍入),则为其他未更改的操作数。
伪代码中的示例
double x = 3.01
int roundDown = (int)x // roundDown = 3
if(x > roundDown) // 3.01 > 3
return roundDown + 1 // return 3.0 + 1.0 = 4.0
else
return x // x equals roundDown
无论如何,你应该使用Math.ceil()
。这只是一个简单的例子,说明如何自己完成。
答案 5 :(得分:0)
BigDecimal( "3.2" ).setScale( 0 , RoundingMode.CEILING )
4
BigDecimal
如果您需要accuracy rather than performance,请避免使用floating point技术。这意味着要避免float
,Float
,double
,Double
。为了准确,请使用BigDecimal
类。
在BigDecimal
,set the scale上,小数点右侧的位数。如果您不想要小数,请将scale设置为零。并指定rounding mode。要始终向上舍入一小部分,请使用RoundingMode.CEILING
,记录为:
舍入模式向正无穷大舍入。如果结果为正,则表现为RoundingMode.UP;如果为负,则表现为RoundingMode.DOWN。请注意,此舍入模式决不会降低计算值。例如,1.1变为2,而你的3.2变为4。
BigDecimal bd = new BigDecimal( "3.2" ) ;
BigDecimal bdRounded = bd.setScale( 0 , RoundingMode.CEILING ) ;
String output = bdRounded.toString() ;
System.out.println( "bdRounded.toString(): " + bdRounded ) ; // 4
4
答案 6 :(得分:-2)
Math.ceil()
会为您提供最接近的最低值,如果您希望将其四舍五入到应使用的最大最接近值Math.floor()