문제
소수점의 정수 부분을 반환하는 가장 좋은 방법은 무엇입니까 (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