总是圆了一双

时间:2013-10-27 04:44:24

标签: java rounding

我怎样才能始终将doubleint舍入,而不是将其向下舍入。 我知道Math.round(double),但我希望它总是围捕。 因此,如果它是3.2,则会四舍五入为4.

7 个答案:

答案 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值。特殊情况:

  • 如果参数值已经等于数学整数,则结果与参数相同。
  • 如果参数为NaN或无穷大或正零或负零,则结果与参数相同。
  • 如果参数值小于零但大于-1.0,则结果为负零。

请注意,Math.ceil(x)的值正好是-Math.floor(-x)的值。

<强>参数:

  • a - 一个值。

<强>返回:

最大(最接近负无穷大)浮点值,该值大于或等于参数且等于数学整数。

答案 1 :(得分:8)

简单来说,

  • Math.ceil将始终向上舍入或如上所述,过剩
  • Math.round将根据小数向上或向下舍入。
    • 如果小数等于或高于5 ,则向上舍入
      • decimal =&gt; 5.(1,5 = 2)
    • 如果小数小于5 ,则向下舍入
      • 十进制&lt; 5.(1,45 = 1)

Math.ceilMath.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)

TL;博士

BigDecimal( "3.2" ).setScale( 0 , RoundingMode.CEILING )
  

4

BigDecimal

如果您需要accuracy rather than performance,请避免使用floating point技术。这意味着要避免floatFloatdoubleDouble。为了准确,请使用BigDecimal类。

BigDecimalset 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

请参阅此code run live at IdeOne.com

答案 6 :(得分:-2)

Math.ceil()会为您提供最接近的最低值,如果您希望将其四舍五入到应使用的最大最接近值Math.floor()