2014-06-06 2 views
1

최대 10 진수 값을 2 점까지 올림합니다. 그러나 0.01보다 작은 숫자의 경우 0.01을 반환하고 싶습니다. C#에서 0이 아닌 경우 지정된 자릿수까지 반올림을 유지하십시오.

RoundUp(0.146,2) should return 0.15 

RoundUp(0.0003,2) should return 0.01 

, 나는 현재 MidpointRounding.AwayFromZero 매개 변수, Math.Round를 사용하고 있고

Math.Round(0.0003, 2, MidpointRounding.AwayFromZero); 

것이 0를 반환합니다.

원하는 동작을 수행하는 데 사용할 수있는 Math 네임 스페이스에 빌드 된 메서드가 있습니까?

현재 나는이 방법

private double GetRoundUpValue(double price, int roundUpto) 
    { 
     Debug.Assert(roundUpto == 2 || roundUpto == 3); 
     var val = Math.Round(price, roundUpto, MidpointRounding.AwayFromZero); 
     Double minValue = roundUpto == 2 ? 0.01 : 0.001; 
     return val < minValue ? minValue : val; 
    } 
+0

0.143 0.14 또는 0.15이어야한다? 당신은 항상 0

+0

0.143은 0.015를 반환해야합니다. – ua741

답변

6

을 사용하고 그러나 0.01 미만 숫자, 나는 0.01을 반환합니다. 간단하게 그냥 같은 것을 사용하지 왜 그런

:

Math.Max(Math.Round(0.0003, 2, MidpointRounding.AwayFromZero), 0.01); 

을 아니면 N 소수점 이하 자릿수로 반올림 같은 것을 사용하는 것이 더 일반적인 무언가를 필요로하는 경우 :

private double GetRoundUpValue(double price, int places) 
{ 
    var minValue = Math.Pow(0.1, places); 
    return Math.Max(Math.Round(price, places, MidpointRounding.AwayFromZero), minValue); 
} 

또한 '0에서 반올림'은 '반올림'과 동일하지 않습니다 (이 경우 Math.Ceiling에서 볼 수 있음). 따라서이 메서드의 이름을 변경하거나 내부에서 실제로 무엇이 진행되고 있는지에 대해 좀 더 명확히 밝힐 것을 권장합니다. 예를 들어

:

private double GetRoundUpValue(double price, int places) 
{ 
    var scale = Math.Pow(10, places); 
    return Math.Ceiling(price * scale)/scale; 
} 
+0

나는 그것을 좋아한다! 키스는 갈 길입니다. – n8wrl

+0

예, 반올림하고 0에서 반올림하는 사이에 차이가 있습니다. 메소드 본문 변경 중 :). – ua741

관련 문제