[c#] Decimal 숫자의 정수 부분을 얻는 가장 좋은 방법

십진수의 정수 부분을 반환하는 가장 좋은 방법은 무엇입니까 (C #에서)? (이것은 int에 맞지 않을 수있는 매우 큰 수에 대해 작동해야합니다).

GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324

그 목적은 다음과 같습니다. db의 십진수 (30,4) 필드에 삽입하고 필드에 비해 너무 긴 숫자를 삽입하지 않도록하고 싶습니다. 소수의 정수 부분 길이를 결정하는 것은이 연산의 일부입니다.



답변

그건 그렇고, (int) Decimal.MaxValue는 오버플로됩니다. 소수가 int 상자에 넣을 수 없을 정도로 너무 커서 소수의 “int”부분을 얻을 수 없습니다. 방금 확인했습니다 … 오랫동안 너무 큽니다 (Int64).

Decimal 값의 비트를 점의 왼쪽에 넣으려면 다음을 수행해야합니다.

Math.Truncate(number)

값을 … A DECIMAL 또는 DOUBLE로 리턴하십시오.

편집 : 잘라내 기는 확실히 올바른 기능입니다!


답변

나는 System.Math.Truncate 가 당신이 찾고있는 것이라고 생각 합니다.


답변

무엇을하는지에 따라 다릅니다.

예를 들면 :

//bankers' rounding - midpoint goes to nearest even
GetIntPart(2.5) >> 2
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -6

또는

//arithmetic rounding - midpoint goes away from zero
GetIntPart(2.5) >> 3
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -7

기본값은 항상 전자입니다. 이는 놀라 울 수 있지만 매우 의미가 있습니다. 입니다.

명시적인 캐스트는 다음을 수행합니다.

int intPart = (int)343564564.5
// intPart will be 343564564

int intPart = (int)343564565.5
// intPart will be 343564566

당신이 말한 방식에서 이것은 당신이 원하는 것이 아닌 것처럼 들립니다. 당신은 매번 그것을 바닥에 놓고 싶습니다.

나는 할것이다:

Math.Floor(Math.Abs(number));

또한 당신의 크기를 확인하십시오 decimal-그들은 상당히 클 수 있으므로 long.


답변

다음과 같이 캐스트하면됩니다.

int intPart = (int)343564564.4342

나중에 계산에서 십진수로 계속 사용하려면 Math.Truncate (또는 음수에 대한 특정 동작을 원하는 경우 Math.Floor 가능)가 원하는 함수입니다.


답변

값과 소수 부분 값을 분리하는 매우 쉬운 방법입니다.

double  d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");

s는 소수 부분 = 5이고
i는 정수 = 3 인 값입니다.


답변

나는 당신을 돕길 바랍니다.

/// <summary>
/// Get the integer part of any decimal number passed trough a string 
/// </summary>
/// <param name="decimalNumber">String passed</param>
/// <returns>teh integer part , 0 in case of error</returns>
private int GetIntPart(String decimalNumber)
{
    if(!Decimal.TryParse(decimalNumber, NumberStyles.Any , new CultureInfo("en-US"), out decimal dn))
    {
        MessageBox.Show("String " + decimalNumber + " is not in corret format", "GetIntPart", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return default(int);
    }

    return Convert.ToInt32(Decimal.Truncate(dn));
}


답변

   Public Function getWholeNumber(number As Decimal) As Integer
    Dim round = Math.Round(number, 0)
    If round > number Then
        Return round - 1
    Else
        Return round
    End If
End Function