문제
나는 수학으로 기대할 것으로 예상되는 결과를 보지 못한다.
return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
MidPointrounding.toeven을 이해할 때, 천분의 5 개 위치는 출력이 99.96이어야합니다. 이것이 사실이 아닌가?
나는 이것을 시도했지만 99.97도 반환했다.
return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100;
내가 무엇을 놓치고 있습니까?
감사!
해결책
당신은 실제로 중간 점에 있지 않습니다. MidpointRounding.ToEven
당신이 숫자가 있었다면 99.965, 즉, 99.96500000 [etc.], 그 다음에 당신은 99.96을 얻을 것입니다. 당신이 수학에 전달하는 숫자 가이 중간 점보다 높기 때문에, 그것은 반올림입니다.
당신이 당신의 번호가 99.96으로 줄어들기를 원한다면, 이것을하십시오.
// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);
그리고 여기에 일반적인 경우 위의 작업을 수행하는 편리한 기능이 있습니다.
// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
double multiplier = Math.Pow(10.0, digits + 1);
double truncated = Math.Truncate(value * multiplier) / multiplier;
return Math.Round(truncated, digits, mode);
}
다른 팁
중간 점 자체에 있다면 99.965 : 99.965 :
C:\temp>ipy IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927 Type "help", "copyright", "credits" or "license" for more information. >>> import clr >>> from System import Math, MidpointRounding >>> Math.Round(99.9651, 2, MidpointRounding.ToEven) 99.97 >>> Math.Round(99.965, 2, MidpointRounding.ToEven) 99.96 >>> Math.Round(99.9649, 2, MidpointRounding.ToEven) 99.96 >>> Math.Round(99.975, 2, MidpointRounding.ToEven) 99.98 >>>
그만큼 MidpointRounding
가치를 반올림하려고 할 때만 가치가 있습니다. 가장 중요한 숫자 다시 말해서 가치는 99.965
원하는 결과를 얻으려면. 여기서는 그렇지 않기 때문에 단순히 표준 반올림 메커니즘을 관찰하는 것입니다. 참조 MSDN 페이지 더 많은 정보를 위해서.
다음은 주제에 대해 약간의 빛을 비추는 결과입니다.
Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven); // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96
중간 점은 49999가 아닌 535789가 아닌 정확히 5입니다.
중간 점 반올림은 값이 두 경우 사이에있는 경우에만 살펴 봅니다.
귀하의 경우에는 "5"가 아니며 "535 ..."이므로 중간 점보다 크고 .96으로 일상하십시오. 기대하는 동작을 얻으려면 세 번째 소수점까지 튀어 나와 미드 포인트 롤링을 사용하여 반올림해야합니다.
Math.round '는'소수점 값을 지정된 수의 분수 숫자로 반올림합니다. ' 99.96500000,2 라운드를 99.96 및 99.96500001 ~ 99.67로 반올림 할 때. 그것은 전체 값을 반올림합니다.
그것이 나라면, 나는 사용하지 않을 것입니다 Math.Round()
, 그것은 당신이 성취하려는 것이 아니기 때문입니다.
이것이 내가 할 일입니다.
double num = 99.96535789;
double percentage = Math.Floor(100 * num) / 100;
읽기가 훨씬 쉽고 수학적 접근 방식입니다.
나는 숫자를 곱합니다 100
, 지금 나 한테있어 9996.535789
.
그런 다음 바닥은 반올림과 뚜렷하게 다르고 숫자에 가장 가까운 가장 작은 정수를 반환하여 얻습니다. 9996
.
그런 다음 나뉘어진다 100
필요한 것을 얻으려면 99.96
.
추신
바닥 반대입니다 천장, 숫자에 가장 가까운 가장 큰 정수를 반환합니다.
그래서 천장 9996.535789
~이다 9997
.
둘 다와 다릅니다 반올림 가장 가까운 정수를 실제로 더 작든 크든 가장 가까운 숫자로 반환하는 소수점이없는 점은 없습니다. 그것이 당신이 얻는 이유입니다 99.97
당신이 사용할 때 반올림.