C #에서 가장 가까운 정수로 반올림하는 방법


답변:


200

자세한 내용은 공식 문서 를 참조하십시오 . 예를 들면 :

기본적으로 Math.Round메서드에 세 개의 매개 변수 를 제공합니다 .

  1. 반올림 할 값입니다.
  2. 값 뒤에 유지하려는 소수 자릿수입니다.
  3. AwayFromZero 반올림을 사용하기 위해 호출 할 수있는 선택적 매개 변수입니다. ( 반올림이 모호하지 않으면 무시됩니다 ( 예 : 1.5 ))

샘플 코드 :

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

라이브 데모

당신은 필요 MidpointRounding.AwayFromZero당신은 0.5 값을 반올림하려면. 불행히도 이것은의 기본 동작이 아닙니다 Math.Round(). 사용하는 경우 MidpointRounding.ToEven(기본값) 값이 가장 가까운 반올림됩니다 수 ( 1.5로 반올림됩니다 2,하지만 2.5또한 반올림됩니다 2).


14
한편, 이용 away from zero도하는 뜻 -1.5라운드 것이다 -2.
davogotland

2
사용 Math.Ceiling, 그 안 좋은 연습 마찰에 대한 Math.Round을 사용하는 읽기 : stackoverflow.com/questions/9221205/...를 ,
Yakir 매너를

3
Math.Round (1.5, 0)는 2를 반환합니다
David Sykes

@davogotland는 어쨌든 138이 아닌 137.5에서 140으로 반올림합니까? 10 분의 1에 가까운 반올림을 의미합니까?
sam

1
@sam은 아마도 10으로 나눈 다음 Math.Ceiling으로 반올림하고 마지막으로 10으로 배수할까요?
davogotland

63
Math.Ceiling

항상 반올림합니다 (천장쪽으로)

Math.Floor

항상 내림합니다 (바닥으로)

당신이 추구하는 것은 단순히

Math.Round

이 게시물에 따라 반올림


어쨌든 138이 아닌 137.5에서 140으로 반올림합니까? 10 분의 1에 가까운 반올림을 의미합니까?
sam

7

당신은 필요 Math.Round하지 않습니다 Math.Ceiling. Ceiling항상 "올림" Round하고 소수점 뒤의 값에 따라 올림 또는 내림합니다.


6

이 설명서가 있고 약간 귀여운 방법도 있습니다.

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

숫자에 0.5를 더하고 int (또는 floor it)로 캐스팅하면 수학적으로 올바르게 반올림됩니다.


여전히 의심스러워 보입니다. 첫째, 문제는 반올림에 대해 묻는 까지 이 그가 원하는 것을하지 않을 수 있습니다 그래서 내가 2로, 지금 Math.Round (1.5) 원의 기본 구현을 시도 할 때, 둘째합니다.
ver.

또한 귀하의 예제는 소수점과 소수점 쉼표를 혼합합니다. 일반적으로 어떤 것을 사용합니까 (스웨덴에서)? :)
ver

죄송합니다 ... 아, 죄송합니다. 물론 소수점을 프로그래밍 할 때, 공식적인 텍스트에서는 소수점 쉼표를 사용합니다. 그리고 예, 스웨덴 ^^ 질문에 대한 "반올림"부분 : 그건 단지 언어 실수라고 생각합니다. op로 주어진 예에서 일부 십진수는 내림됩니다.
davogotland

@ Math.Round로 반올림하지 않을 때마다 캐스트와 함께합니다. ), 즉이 방법은 사용 설명서와 좀 귀엽다 이유
davogotland

5

다른 사람들이 제안한대로 (권장) Math.Round를 사용하거나, 0.5를 추가하고 int에 캐스트 (소수 부분이 삭제됨) 할 수 있습니다.

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2

5

알림입니다. 두 배를 조심하십시오.

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2

3

원하는 것을 정확하게 수행하는 Math.Round 함수가 있습니다.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
무엇에 대한 1.5값으로? 더 많은 매개 변수가 필요합니다.
여기 만 볼리비아

2

이것은 가장 가까운 5로 반올림되거나 이미 5로 나눌 수있는 경우 변경되지 않습니다.

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}

2

나는 이것을 찾고 있었지만 내 예는 4.2769와 같은 숫자를 가져다가 4.3과 같은 범위에 놓는 것입니다. 똑같지는 않지만 도움이된다면 :

Model.Statistics.AverageReview   <= it's just a double from the model

그때:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

기타...


나는 또한 문자열이 필요하고 .ToString ( "n0")이 나를 위해 반올림을 처리하기 때문에이 방법을 사용하고 있습니다. 1.5m.ToString ( "n0") // "2"반환
Nathan Prather



0

부동 소수점 숫자가 아닌 정수로 작업하는 경우 방법이 있습니다.

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

여기서 "numr""denr" 은 모두 부호없는 정수입니다.



0

자신의 라운드 방법을 작성하십시오. 같은 것,

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.