99

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

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

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

4

7 に答える 7

228

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

ドットの左に Decimal 値のビットが必要な場合は、次のようにする必要があります。

Math.Truncate(number)

値を次のように返します... DECIMALまたはDOUBLE。

編集:切り捨ては間違いなく正しい機能です!

于 2009-01-26T13:03:16.263 に答える
26

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

于 2009-01-26T13:32:05.880 に答える
4

あなたがしていることに依存します。

例えば:

//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

于 2009-01-26T13:26:10.960 に答える
1

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

int intPart = (int)343564564.4342

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

于 2009-01-26T13:03:21.833 に答える