double을 반올림하여 int로 변환 (Java)


119

지금 나는 이것을 시도하고 있습니다.

int a = round(n);

여기서 nA는 double그것을하지만 작동하지 않습니다. 내가 뭘 잘못하고 있죠?



6
"작동하지 않음"을 더 자세히 설명해야합니다. 무슨 일이야? 어떻게되지 않습니까? 무엇을 기대 했습니까? 어떤 오류가 있었습니까? 당신은 가지고 있습니까 round()같은 클래스의 방법을? 당신은 import static java.lang.Math.*? Etc .. 숫자를 반올림하는 방법은 다양하므로 가능한 답도 많이 있습니다. 즉, 귀하의 질문이 모호하고 모호하며 현재 형식으로 합리적으로 답변 할 수 없습니다. 어둠 속에서 촬영하고 있습니다.
BalusC 2010

1
"작동하지 않음"은 가장 가까운 int로 반올림하지 않거나 예외를 발생 시키거나 반올림하지 않음을 의미합니까? 이 질문은 답과 문맥을 상호 참조하지 않으면 쓸모가 없습니다.
modulitos

답변:


239

round()스 니펫 에서 메소드 의 반환 유형은 무엇입니까 ?

이것이 Math.round()메서드 인 경우 입력 매개 변수가 Double 일 때 Long을 반환합니다.

따라서 반환 값을 캐스팅해야합니다.

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

1
int로 캐스팅하는 대신 Math.toIntExact (long)를 사용하는 것이 좋습니다. double은 상당한 범위의 값을 보유 할 수 있으며 double이 예상보다 크면 가장 중요한 비트를 조용히 버리고 싶지 않을 것입니다.
othp

캐스트가 필요하지 않다고 생각합니다. 과거 였는지 모르겠지만 round는 int를 반환합니다.
드롭 아웃

@Dropout Math.round는 float를 주면 int를 반환하고 double을 주면 long을 반환합니다.
Tur1ng

27

Math.round ()가 마음에 들지 않으면 다음과 같은 간단한 방법을 사용할 수도 있습니다.

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

4
Math.round()
싫어하는

3
이 솔루션은 더 짧고 가져올 필요가 없으며 최소한의 변경만으로 다른 많은 프로그래밍 언어로 이식 할 수 있습니다. : 그리고 심지어 플랫폼에 따라 빠를 수도 stackoverflow.com/questions/12091014/...
박사 다니엘 톰즈

1
나는 당신의 대답을 비판하는 것이 아니며, 당신이 언급 한 이유로 매우 유용하다고 생각합니다. 저는이 의견 Math.round()을 통해 귀하가 제공하는 솔루션과 "문자 그대로"동일한 작업을 수행하는 을 사용 하는 것을 두려워하는 사람들을 언급했습니다 . 건배.
Gauthier Boaglio

2
네, nehz가 말했듯이 예를 들어 -2.1에서 -1로 반올림 할 것이라고 믿습니다.
Ben Aaronson

5
@AlbertoHormazabal, 그가 추가 한 것을 눈치 채지 못했 0.5습니까?
사샤

11

다음 과 같이 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;          
    }
}

원하는대로 조건 (결과 <0.5) 을 변경할 수 있습니다 .


나는 anivaler의 대답에 동의합니다. 그러나 가장 높은 정수로 반올림해야하는 경우 아래와 같이 할 수 있습니다. 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 함수가 오버로드되었습니다. float 값을 받으면 int를 제공합니다. 예를 들어 이것은 작동합니다.

int a=Math.round(1.7f);

double 값을 받으면 long 값을 제공하므로 int로 형변환해야합니다.

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

이것은 정밀도 손실을 방지하기 위해 수행됩니다. double 값은 64 비트이지만 int 변수는 32 비트 만 저장할 수 있으므로 long (64 비트)으로 변환하지만 위에서 설명한대로 32 비트로 형변환 할 수 있습니다.


1

의 문서 Math.round:

인수를 정수 로 반올림 한 결과를 반환합니다 . 결과는 (int) Math.floor(f+0.5).

에 캐스트 할 필요가 없습니다 int. 과거와 달라졌을 수도 있습니다.


4
Math.round 메서드는 두 가지가 있습니다. float를 취하는 것은 정수를 반환합니다. 그러나 두 배가 걸리는 사람은 오래 걸립니다.
Dominik Ehrenberg 2015


-1

더 완전한 예제를 게시해야하므로 수행하려는 작업을 확인할 수 있습니다. 귀하가 게시 한 내용에서 볼 수있는 내용은 다음과 같습니다. 첫째, 기본 제공 round()방법 이 없습니다 . 을 호출 Math.round(n)하거나 정적으로 가져와야합니다 Math.round. 그런 다음 원하는대로 호출해야합니다.


시작을 위해 Java에는 전역 함수가 없습니다.
Danon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.