小数の整数部分を返す最良の方法は何ですか(c#で)? (これは、intに収まらない可能性がある非常に大きな数に対して機能する必要があります)。
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
これの目的は次のとおりです。dbの10進数(30,4)フィールドに挿入し、フィールドに対して長すぎる数値を挿入しようとしないようにします。小数の整数部分の長さを決定することは、この操作の一部です。
ちなみに、(int)Decimal.MaxValueはオーバーフローします。小数はintボックスに入れるには大きすぎるため、小数の「int」部分を取得することはできません。チェックしてみてください...それは長すぎて大きすぎます(Int64)。
ドットの左に10進値のビットが必要な場合は、これを行う必要があります。
Math.Truncate(number)
そして、値を... DECIMALまたはDOUBLEとして返します。
編集: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
を使用する必要がある場合があります。
お役に立てば幸いです。
/// <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));
}
値とその小数部の値を分離する非常に簡単な方法。
double d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");
sは小数部= 5および
iは整数= 3としての値です
次のようにキャストするだけです:
int intPart = (int)343564564.4342
後の計算で小数として使用したい場合は、Math.Truncate(または負の数値に対して特定の動作が必要な場合はMath.Floor)が必要な関数です。