33

我怎么能总是将 a 舍double入为int,而从不将其舍入。我知道Math.round(double),但我希望它总是四舍五入。因此,如果是3.2,则四舍五入为 4。

4

7 回答 7

44

你可以使用Math.ceil()方法。

请参阅 JavaDoc 链接:https://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#ceil(double)

从文档:

细胞

public static double ceil(double a)

返回大于或等于参数且等于数学整数的最小(最接近负无穷大)双精度值。特别案例:

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

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

参数:

  • a - 一个值。

回报:

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

于 2013-10-27T04:46:51.930 回答
15

简单来说,

  • Math.ceil将始终向上舍入或如上所述,超过.
  • Math.round将根据小数向上或向下舍入。
    • 如果小数等于或大于 5,则四舍五入
      • 小数 => 5. (1,5 = 2)
    • 如果小数小于 5,则向下舍入
      • 小数 < 5. (1,45 = 1)

Math.ceil和的例子Math.round

下面的代码将返回:
成本,没有 Ceil 2.2 和 Ceil 3 (int),3.0 (double)。如果我们舍入它: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 (double)。如果我们将它四舍五入:2
如果我们将 m2 的值更改为例如2550,结果将是:
成本,没有 Ceil 2.55 和 Ceil 3 (int),3.0 (double)。如果我们舍入它:3

希望能帮助到你。(从以前的答案中提取的信息,我只是想让它更清楚)。

于 2014-12-15T14:27:55.487 回答
4

tl;博士

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

4

BigDecimal

如果您想要准确性而不是性能,请避免使用浮点技术。这意味着避免float, Float, double, Double。为了准确性,请使用BigDecimal类。

在 a 上BigDecimal设置 scale,小数点右侧的位数。如果您不需要小数,请将比例设置为零。并指定舍入模式。要始终向上舍入分数,请使用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

请参阅在 IdeOne.com 上实时运行的代码

于 2017-10-30T05:28:59.090 回答
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;          
    }
}

好工作 !;)

于 2014-06-28T14:51:50.107 回答
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();
    }
于 2015-07-23T18:39:28.790 回答
0

不使用Math.ceil()的简短示例。

public double roundUp(double d){
    return d > (int)d ? (int)d + 1 : d;
}

说明: 使用类型转换将操作数与向下舍入的操作数进行比较,如果更大则返回向下舍入的参数 + 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(). 这只是一个简单的例子,说明你如何自己做。

于 2015-12-21T12:16:56.313 回答
-3

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

于 2013-10-27T05:50:09.237 回答