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.