2013-10-27 43 views
19

我怎么总是将一个double加到int上,并且永远不会舍入它。 我知道Math.round(double),但我希望它总是四舍五入。 因此,如果它是3.2,它会四舍五入为4.总是向上舍入一个双倍

这可能吗?

+8

'Math.ceil' - 如果将来有这样的问题,您可以阅读相关库的生成JavaDoc。在这种情况下,Math –

+0

即使你不喜欢RTFM,Math.round(yourNum + 0.5)也可以工作。 – nhgrif

+1

@nhgrif不像'0.0'将四舍五入到'1',这与四舍五入和加1相同。 –

回答

26

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

见JavaDoc的链接:https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#ceil-double-

从文档:

小区

public static double ceil(double a) 

返回最小的(最接近负无穷大)双值,该值大于或等于所述参数并且等于一个数学整数。特殊情况:

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

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

参数:

  • 一个 - 一个值。

返回:

最小(最接近负无穷大)浮点值,该值大于或等于该参数,并等于某个整数。

+0

如果您可以从链接引用,它可以帮助人们在Stack Overflow上找到完整的答案。 –

+0

@ZacharyVance done – rpax

+0

_ceil_返回一个_double_,他要求输入_int_ –

-2

Math.ceil()如果你希望它被四舍五入到最接近的最大价值,你应该使用Math.floor()

+1

这是回到前面。 – EJP

-2

Math.ceil

公共静态双小区会给你最接近的最低值(双A)

返回最小(最接近负无穷大)双值大于或等于参数且等于数学整数。特殊情况:

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;   
    } 
} 

干得好!)

7

在简单的话,

  • Math.ceil将总是圆形UP或如上面所说的,在过量
  • Math.round将根据小数进行舍入或舍入。
    • 如果小数点是等于或大于5,那么它的四舍五入为
      • 小数=> 5(1,5 = 2)
    • 如果小数是小于5,那么它的四舍五入
      • Math.ceilMath.round小数< 5.(1,45 = 1)

实例:

下面的代码将返回:
成本,而不的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); 

如果我们平方米的值更改为例如,其结果将是: 成本,而不的Ceil 2.499并用的Ceil 3(INT),3.0(双) 。如果我们圆它:2
如果我们平方米的值更改为例如,其结果将是:
成本,而不的Ceil 2.55并用的Ceil 3(INT),3.0(双)。如果我们围绕它:3

希望它有帮助。 (从以前的答案中提取的信息,我只是想说清楚)。

0

我的方法比较简单,希望它适合你。

在我的情况下,我有一行对象只能容纳3个项目,我必须调整我必须容纳这些项目的行数。

所以我有一些Double numberOfRows,然后我使用numberOfRows.intValue()来获取numberOfRows的int值。

如果我得到的int值小于numberOfRows,我给numberOfRows加1来四舍五入,否则我从numberOfRows.intValue()得到的值就是我想要的答案。

我写了这个简单的for循环来测试一下:不使用Math.ceil()

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(); 
    } 
0

简短的例子。

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()。这只是一个简单的例子,你可以自己做。

0

TL;博士

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

BigDecimal

如果你想accuracy rather than performance,避免floating point技术。这意味着要避免float,Float,double,Double。为了准确,请使用BigDecimal类。

BigDecimal,set the 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 

看到这个code run live at IdeOne.com