문제

소수점의 정수 부분을 반환하는 가장 좋은 방법은 무엇입니까 (C#)? (이것은 int에 맞지 않을 수있는 매우 많은 숫자로 작동해야합니다).

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

이것의 목적은 다음과 같습니다. 나는 DB의 소수점 (30,4) 필드에 삽입하고 있으며, 필드에 너무 긴 것보다 숫자를 삽입하려고하지 않도록하고 싶습니다. 소수점의 정수 부분의 길이를 결정하는 것이이 작업의 일부입니다.

도움이 되었습니까?

해결책

그건 그렇고, guys, (int) decimal.maxvalue가 오버플로됩니다. 소수점이 int 상자에 넣기에는 너무 크기 때문에 소수점의 "int"부분을 얻을 수 없습니다. 방금 확인했습니다 ... 너무 큽니다 (int64).

도트의 왼쪽에 소수점 값 비트를 원한다면 다음을 수행해야합니다.

Math.Truncate(number)

그리고 값을 소수점 또는 이중으로 반환합니다.

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

다른 팁

제 생각에는 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 (또는 음수에 대한 특정 동작을 원할 경우 수학)가 원하는 기능입니다.

값과 분수 부품 값을 분리하는 매우 쉬운 방법.

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

S는 분수 부품 = 5 및입니다
나는 정수 = 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top