将double四舍五入转换为int(Java)

136

我现在正在尝试这个:

int a = round(n);

我使用了double类型的变量n,但代码并没有按照我的期望工作。请问我错在哪里?


可能是https://dev59.com/-nVC5IYBdhLWcg3w4Vb6的重复问题。 - Matt Ball
6
请更详细地说明“不工作”的情况:发生了什么?没有发生什么?你期望发生什么?你遇到了什么错误?在同一类中是否有“round()”方法?是否导入了“static java.lang.Math.*”?等等。有很多种方式来进行数字舍入,因此也有很多可能的答案。换句话说,您的问题模糊不清,无法以当前的形式合理回答。这就像是盲目射击。 - BalusC
1
“not working” 的意思是指没有四舍五入到最近的整数,还是抛出异常,或者是没有向上/向下取整?如果没有将问题与答案进行交叉参考,那么这个问题就毫无意义。 - modulitos
8个回答

271

在这个片段中,round()方法的返回类型是什么?

如果这是Math.round()方法,则当输入参数为Double时,它返回一个Long。

因此,你需要将返回值进行强制转换:

int a = (int) Math.round(doubleVar);

5
考虑使用 Math.toIntExact(long) 代替简单地将 double 强制转换为 int;double 可以承载相当范围的值,如果你的 double 值比预期大,你可能不希望静默地丢弃最重要的位。 - othp
我认为转换是不必要的。我不知道过去是否需要,但 round 函数确实返回整数。 - Dropout
@Dropout 如果你给Math.round一个浮点数,它会返回一个整数,如果你给它一个双精度浮点数,它会返回一个长整型。 - Tur1ng

31

如果你不喜欢Math.round(),你也可以使用这个简单的方法:

int a = (int) (doubleVar + 0.5);

7
不喜欢Math.round()显然没有任何有价值的理由:https://dev59.com/OWw15IYBdhLWcg3wqNkB#6468757 - Gauthier Boaglio
5
这种解决方案更短,不需要导入任何内容,并且可以轻松地移植到许多其他编程语言中,只需进行最小的更改。根据您的平台,它甚至可能更快。参考链接:https://dev59.com/xmfWa4cB1Zd3GeqPipps#12091343 - Dr. Daniel Thommes
2
我并不是在批评你的回答,我认为你提到的原因非常有用。我的评论是针对那些害怕使用 Math.round() 的人,因为它与你提供的解决方案“字面上”是一样的。就这些了,谢谢。 - Gauthier Boaglio
3
是的,就像nehz所说,我相信这会将-2.1四舍五入为-1,例如。 - Ben Aaronson
7
@AlbertoHormazabal,你没注意到他加了 0.5 吗? - Sasha
显示剩余2条评论

12

double 四舍五入到“最近”的 整数,就像这样:

1.4 -> 1

1.6 -> 2

-2.1 -> -2

-1.3 -> -1

-1.5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

您可以根据自己的需要更改条件(result<0.5)


我同意anivaler的答案。但是,如果你只需要将数字四舍五入到最接近的整数,可以使用以下代码:double decimalNumber = 4.56777; System.out.println( new Float( Math.round(decimalNumber )) );输出结果为:5 - Smeet

9

Math.round函数是一个重载函数,当它接收到一个浮点值时,会返回一个整数值。例如:

int a=Math.round(1.7f);

当它接收到一个双精度浮点数时,它会给你一个长整型,因此你需要将其强制转换为整型。

int a=(int)Math.round(1.7);

这是为了防止精度丢失。你的double值是64位,但int变量只能存储32位,因此它会将其转换为long,长整型是64位,但可以按照上述方式强制转换为32位。


3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}

1
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}

1

Math.round的文档说明:

返回将参数四舍五入到整数的结果。结果相当于 (int) Math.floor(f+0.5)

不需要强制转换为 int。也许这是从过去改变的。


4
有2个Math.round方法。一个接受浮点数并返回整数,这是正确的。但另一个接受双精度数并返回长整型。 - Dominik Ehrenberg

-1
你真的需要发布一个更完整的例子,这样我们才能看到你想做什么。从你发布的内容来看,我能看到以下几点。首先,没有内置的round()方法。你需要调用Math.round(n),或者静态导入Math.round,然后像你所做的那样调用它。

Java 中没有全局函数,首先。 - Danon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接