四舍五入以将其转换为int(java)


119

现在,我正在尝试:

int a = round(n);

在哪里ndouble但它不起作用。我究竟做错了什么?



6
您应该更详细地阐述“不起作用”。怎么了?不会发生什么事?您期望什么?您遇到了什么错误?您round()在同一个类中有一个方法吗?是import static java.lang.Math.*吗 等等。有许多种方法可以四舍五入数字,因此也有很多可能的答案。换句话说,您的问题模棱两可,无法以目前的形式合理地回答。在黑暗中射击。
BalusC

1
“不工作”是否表示不舍入到最接近的int或引发异常,或者不舍入/舍入?这个问题是没有用的,而不必将上下文与答案交叉引用。
modulitos

Answers:


239

round()代码段中方法的返回类型是什么?

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

因此,您将必须强制转换返回值:

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

1
考虑使用Math.toIntExact(long)而不是仅强制转换为int;双精度数可以容纳相当范围的值,并且如果双精度数大于预期值,您可能不想静默丢弃最高有效位。
othp

我认为演员是没有必要的。我不知道是否过去,但是round确实返回int。
辍学

@Dropout Math.round如果给定浮点数,则返回一个int;如果给定双精度数,则返回一个long。
Tur1ng

27

如果您不喜欢Math.round(),也可以使用以下简单方法:

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

4
显然没有不喜欢的原因很重要Math.round()stackoverflow.com/a/6468757/1715716
Gauthier Boaglio

3
该解决方案更短,不需要导入,并且只需很少的更改即可移植到许多其他编程语言中。它甚至可能会更快根据您的平台:stackoverflow.com/questions/12091014/...
丹尼尔Thommes博士

1
我并不是在批评您的答案,出于您提到的原因,我认为这非常有用。通过此评论,我是针对那些害怕使用的人Math.round(),这些人与您提供的解决方案“字面上”相同,仅此而已。干杯。
Gauthier Boaglio '16

2
是的,就像nehz所说的那样,我相信这会例如将-2.1舍入为-1。
Ben Aaronson

5
@AlbertoHormazabal,您没有注意到他添加了0.5吗?
萨沙

11

四舍五入到“最近” 的整数这样的:

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

您可以根据需要更改条件(结果<0.5)


我同意那位精打细算的人的回答。但是,如果您只需要四舍五入为最大整数,则可以像下面这样:double decimalNumber = 4.56777; System.out.println(new Float(Math.round(decimalNumber))); 输出:5
Smeet

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

3

Math.round函数已重载收到浮点值时,它将为您提供一个int值。例如,这将起作用。

int a=Math.round(1.7f);

当它收到一个双精度值时,它会给你一个很长的时间,因此必须将它强制转换为int类型。

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

这样做是为了防止精度损失。您的double值是64bit,但是您的int变量只能存储32bit,因此只能将其转换为long,即64bit,但是您可以如上所述将其转换为32bit。


1

的文档Math.round说:

返回将参数舍入为整数的结果。结果等于(int) Math.floor(f+0.5)

无需强制转换为int。也许它是过去的改变。


4
有2种Math.round方法。进行浮点运算的返回一个整数,这是正确的。但是花一倍的钱会返回很长的时间。
Dominik Ehrenberg 2015年


-1

您确实需要发布一个更完整的示例,以便我们可以了解您要执行的操作。从您发布的内容来看,这是我所看到的。首先,没有内置round()方法。您需要调用Math.round(n)或静态导入Math.round,然后像平常一样调用它。


首先,java中没有全局函数。
农[
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.