web-dev-qa-db-ja.com

10進数の整数部分を取得する最良の方法

小数の整数部分を返す最良の方法は何ですか(c#で)? (これは、intに収まらない可能性がある非常に大きな数に対して機能する必要があります)。

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

これの目的は次のとおりです。dbの10進数(30,4)フィールドに挿入し、フィールドに対して長すぎる数値を挿入しようとしないようにします。小数の整数部分の長さを決定することは、この操作の一部です。

76
Yaakov Ellis

ちなみに、(int)Decimal.MaxValueはオーバーフローします。小数はintボックスに入れるには大きすぎるため、小数の「int」部分を取得することはできません。チェックしてみてください...それは長すぎて大きすぎます(Int64)。

ドットの左に10進値のビットが必要な場合は、これを行う必要があります。

Math.Truncate(number)

そして、値を... DECIMALまたはDOUBLEとして返します。

編集:Truncateは間違いなく正しい関数です!

185
Will

System.Math.Truncate が探しているものだと思います。

22
Mark Carpenter

何をしているのかに依存します。

例えば:

//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を使用する必要がある場合があります。

3
Keith

お役に立てば幸いです。

/// <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));
}
0
luka

値とその小数部の値を分離する非常に簡単な方法。

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

sは小数部= 5および
iは整数= 3としての値です

0
Amit Gohel

次のようにキャストするだけです:

int intPart = (int)343564564.4342

後の計算で小数として使用したい場合は、Math.Truncate(または負の数値に対して特定の動作が必要な場合はMath.Floor)が必要な関数です。

0
Noldorin