我怎么能总是将 a 舍double
入为int
,而从不将其舍入。我知道Math.round(double)
,但我希望它总是四舍五入。因此,如果是3.2
,则四舍五入为 4。
7 回答
你可以使用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 - 一个值。
回报:
大于或等于参数且等于数学整数的最小(最接近负无穷大)浮点值。
简单来说,
Math.ceil
将始终向上舍入或如上所述,超过.Math.round
将根据小数向上或向下舍入。- 如果小数等于或大于 5,则四舍五入。
- 小数 => 5. (1,5 = 2)
- 如果小数小于 5,则向下舍入。
- 小数 < 5. (1,45 = 1)
- 如果小数等于或大于 5,则四舍五入。
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
希望能帮助到你。(从以前的答案中提取的信息,我只是想让它更清楚)。
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
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 个项目的对象,我必须调整必须容纳这些项目的行数。
所以我有一些 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();
}
不使用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()
. 这只是一个简单的例子,说明你如何自己做。
Math.ceil()
如果您希望将其四舍五入为您应该使用的最大最接近值,将为您提供最接近的最低值Math.floor()