문제

나는 수학으로 기대할 것으로 예상되는 결과를 보지 못한다.

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 당신이 사용할 때 반올림.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top