그것은 당신이 자르기가 decmial 값을 유지해야한다고 생각하는 이유를 명확하지 않다.
.NET 내의 기본 방법은 다음 내용에서 설명된다 : d의
정수 부분; 즉, 자릿수가 버린 이후에 남아있는 번호입니다.
당신이 원하는 것은 double/decmial 값의 출력 문자열을 형식화하거나 Math.Round (double, int) 함수를 대신 사용하는 것 같습니다.
당신은 사용할 수 있습니다 : 중복 질문 중 하나에서
double num = 2.22939393; num = Convert.ToDouble(num.ToString("#0.000"));
:이 이해
public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));
return Math.Truncate((power * numberToTruncate))/power;
}
는 여전히 Truncate
방법을 사용합니다. 숫자의 십진수 값을 유지하는 Truncate
메서드가 필요하고 기본 제공 Truncate
메서드가 필요하기 때문에이 코드 만 제공했습니다.
당신은 항상 그냥이를 사용할 수 있습니다 : 나는
private static unsafe double InternalRound(double value, int digits, MidpointRounding mode) {
if (Abs(value) < doubleRoundLimit) {
Double power10 = roundPower10Double[digits];
value *= power10;
if (mode == MidpointRounding.AwayFromZero) {
double fraction = SplitFractionDouble(&value);
if (Abs(fraction) >= 0.5d) {
value += Sign(fraction);
}
}
else {
// On X86 this can be inlined to just a few instructions
value = Round(value);
}
value /= power10;
}
return value;
}
public static double Round(double value, int digits)
{
if ((digits < 0) || (digits > maxRoundingDigits))
throw new ArgumentOutOfRangeException("digits", Environment.GetResourceString("ArgumentOutOfRange_RoundingDigits"));
return InternalRound(value, digits, MidpointRounding.ToEven);
}
public static double Round(double value, MidpointRounding mode) {
return Round(value, 0, mode);
}
public static double Round(double value, int digits, MidpointRounding mode) {
if ((digits < 0) || (digits > maxRoundingDigits))
throw new ArgumentOutOfRangeException("digits", Environment.GetResourceString("ArgumentOutOfRange_RoundingDigits"));
if (mode < MidpointRounding.ToEven || mode > MidpointRounding.AwayFromZero) {
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidEnumValue", mode, "MidpointRounding"), "mode");
}
return InternalRound(value, digits, mode);
}
public static Decimal Round(Decimal d) {
return Decimal.Round(d,0);
}
public static Decimal Round(Decimal d, int decimals) {
return Decimal.Round(d,decimals);
}
public static Decimal Round(Decimal d, MidpointRounding mode) {
return Decimal.Round(d, 0, mode);
}
public static Decimal Round(Decimal d, int decimals, MidpointRounding mode) {
return Decimal.Round(d, decimals, mode);
}
공공 정적 진수 층 (10 진 d)를 말할 수있는
Math.Round는 {에서 을 SplitFractionDouble
를 호출하지 않습니다 return Decimal.Floor (d); }
[MethodImplAttribute (MethodImplOptions.InternalCall)] public static extern double Floor (double d);
맞지 않습니다. 그것은'12.346'으로 반올림합니다. –
THank하지만 내부적으로 동일한 SplitFractionDouble 메서드도 호출합니다. –
@Ramhound 나는 그 방법에 "반대"하지 않고, 나는 단지 내 자신을 구현하고 싶다. –