double을 가장 가까운 정수 값으로 어떻게 변환 할 수 있습니까?


147

double을 가장 가까운 int로 어떻게 변환합니까?

답변:


78

Math.round()와 함께 사용 가능MidpointRounding.AwayFromZero

예 :

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3

6
하지 않습니다 Convert.ToInt32()같은 일을, 또는 단순히 소수점 이하 모든 것을 제거합니까?
머핀 맨

208
실제로 정수를 생성하지 않지만 이중을 생성합니다.
gatopeich

13
@Ronnie-아뇨, 의도적으로 설계된 것입니다. 기본적으로 Math.Round는 중간 점 숫자 (x + .5)를 가장 가까운 짝수로 반올림 합니다. 다른 행동을 원한다면 깃발을 통해 그것을 지정해야합니다. msdn.microsoft.com/ko-kr/library/system.midpointrounding.aspx
nickf

6
글쎄, 난 절대! :)
Ronnie

5
Double은 Int가 아닙니다.
Evgeni Nabokov

267
double d = 1.234;
int i = Convert.ToInt32(d);

참고

다음과 같이 반올림을 처리합니다.

가장 가까운 32 비트 부호있는 정수로 반올림됩니다. 값이 두 정수 사이의 중간이면 짝수가 리턴됩니다. 즉, 4.5는 4로 변환되고 5.5는 6으로 변환됩니다.


7
Math.Round필요한 경우 int를 반환하므로 훨씬 좋습니다 .
Keith

10
@ robert-koritnik. 왜 "유효하지 않은"지 모르겠습니다. OP는 기본 반올림 규칙을 지정하지 않았으며 "round .5 to 가장 가까운 짝수"는 표준 규칙입니다. 항상 반올림하면 원하지 않는 통계 효과가 있습니다.
Keith

@ Keith : 모르겠지만 항상 x.5 를 반올림 하도록 배웠지 만 통계를 위해 위 또는 아래로 추론을 할 수 있습니다. 고마워 추신 : 이런 종류의 반올림이 기본으로 보이는 통계, 재무 또는 회계에 있지 않은 것은 분명합니다 .
Robert Koritnik

3
"반올림은 항상 원치 않는 통계적 영향을 미칩니다."– 그것은 단지 거짓입니다. - 라운드까지 0.5 정확히 절반 숫자를 반올림 [0,.5)반 번호를 정확히 - - [.5,1)- 최대. 이 라운드로 조금이라도에 라운딩, 짝수을 바이어스 (.5,1.5)1 만 [1.5,2.5]2로
짐 Balter

11
@JimBalter 0이 반올림되지 않으므로 반올림하면 양의 바이어스가 발생하므로 비대칭 반올림이라고합니다. 분포가 충분하고 반올림이 짝수 또는 고르지 않은 숫자로 편향되지 않으면 "반올림에서 짝수로"는 그렇지 않습니다. 중간 반올림 타이 브레이킹을 참조하십시오 .
sdds

36

기능을 사용할 수도 있습니다.

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

아키텍처에 따라 몇 배 더 빠릅니다.


이것은 Math.Round가 내가 원하는 방식으로 작동하지 않았기 때문에 나에게 완벽했습니다.
Hanna

@cullub 네 그렇습니다. 0.5가 추가 된 double d를 정수로 변환합니다.
Darrell

이것은 내가 선호하는 방법입니다-매우 간단한 방식으로 작동합니다. Math.Round (d, MidpointRounding.AwayFromZero)보다 훨씬 짧고 읽기 쉽고 if 문을 사용하여 반올림 또는 반올림할지 선택하는 것보다 더 간결합니다. AND, 실제로 말에 정수를 반환하지 더블
binderbound

3
음수에 대한 이상한 행동은 아래의 @ Eternal21의 주석을 참조하십시오 (MyRound (-1.2) = 0)
Chris

2
궁금한 점이 있다면 @Chris가 언급 한 문제는 이제 값이 음수인지 확인하여 해결할 수 있습니다.
John Weisz

14
double d;
int rounded = (int)Math.Round(d);

5

나는이 질문이 오래되었다는 것을 알고 있지만 비슷한 질문에 대한 답을 찾기 위해 그 질문을 발견했습니다. 나는 내가받은 매우 유용한 팁을 나눌 것이라고 생각했다.

int로 변환 할 때 .5다운 캐스트하기 전에 값을 추가 하십시오. 다운 캐스팅은 int항상 더 낮은 숫자 (예 :)로 떨어 지므로 숫자 (int)1.7 == 1.5더 높으면 .5다음 숫자로 추가 하고 다운 캐스트 int는 올바른 값을 반환해야합니다. (예를 들어 (int)(1.8 + .5) == 2)


13
음수 값을 그런 식으로 변환하려고하면 문제가 발생합니다. 예를 들어 -1.25는 0과 같습니다 (-1.25 + 0.5 = 0.75, int로 캐스트되면 0 임). 따라서 음수 값에서 0.5를 빼야합니다.
Eternal21

하나를 사용할 수 있습니다+ 0.5 * Math.Abs(d)
TaW


-1

Unity의 경우 Mathf.RoundToInt를 사용 하십시오 .

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.0f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.2f));
        // Prints 11
        Debug.Log(Mathf.RoundToInt(10.7f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.5f));
        // Prints 12
        Debug.Log(Mathf.RoundToInt(11.5f));

        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.0f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.2f));
        // Prints -11
        Debug.Log(Mathf.RoundToInt(-10.7f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.5f));
        // Prints -12
        Debug.Log(Mathf.RoundToInt(-11.5f));
    }
}

출처

public static int RoundToInt(float f) { return (int)Math.Round(f); }

Q는 Unity를 언급하거나 태그하지 않습니다.
XenoRo

@ XenoRo 나는 Unity를 사용할 때 비슷한 답변을 찾는 사람들을 위해이 오래된 질문에 대답했습니다.
zwcloud

2
지식 공유에 대한 자신의 질문에 대답 할 수 있습니다. 이와 같은 경우 API (이 경우 Unity)와 관련된 별도의 질문을 작성하십시오. 답변은 질문에 적절해야합니다. 그렇지 않으면 반올림 함수가있는 모든 단일 C # API에 대한 답변이 여기에있을 수 있습니다.
XenoRo

-2

Int 버튼을 사용하는 과학 용 계산기를 개발 중입니다. 다음은 간단하고 안정적인 솔루션이라는 것을 알았습니다.

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

Math.Round는 때때로 예기치 않은 또는 바람직하지 않은 결과를 생성하고, 캐스트 또는 Convert.ToInt ...를 통한 정수로의 명시 적 변환은 종종 고정밀도 숫자에 대해 잘못된 값을 생성합니다. 위의 방법은 항상 작동하는 것 같습니다.


2
이것은 모든 음수를 반올림하지 않고 모든 양수를 반올림하지 않습니까? 반드시 "가장 가까운"정수는 아닙니다.
Tim Pohlmann

이것은 가장 가까운 숫자가 아닙니다.
Samer Aamar

1
1.99가 주어지면 1.0을 반환합니다.
Jon Schneider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.