获得十进制数的整数部分的最佳方法

时间:2009-01-26 12:59:52

标签: c# .net decimal int

返回小数的整数部分的最佳方法是什么(在c#中)? (这必须适用于可能不适合int的非常大的数字)。

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

这样做的目的是:我插入数据库中的十进制(30,4)字段,并希望确保我不会尝试插入一个数字而不是太长的字段。确定小数的整数部分的长度是此操作的一部分。

7 个答案:

答案 0 :(得分:182)

顺便说一下,(int)Decimal.MaxValue会溢出。你不能得到十进制的“int”部分,因为小数太大而无法放入int框中。刚刚检查过......它甚至太长了(Int64)。

如果你想要一个十进制值的位到点的左边,你需要这样做:

Math.Truncate(number)

并将值返回为...... DECIMAL或DOUBLE。

编辑:Truncate绝对是正确的功能!

答案 1 :(得分:22)

我认为System.Math.Truncate正是您所寻找的。

答案 2 :(得分:3)

取决于你在做什么。

例如:

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

默认值始终是前者,这可能是一个惊喜,但makes very good sense

您的明确演员会:

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 :(得分:0)

你只需要施放它,就像这样:

int intPart = (int)343564564.4342

如果您仍想在以后的计算中将其用作小数,那么Math.Truncate(如果您想要负数的特定行为,则可能是Math.Floor)是您想要的函数。

答案 4 :(得分:0)

分离值及其小数部分值的非常简单的方法。

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

s是小数部分= 5和
我是整数值= 3

答案 5 :(得分:0)

希望对您有所帮助。

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

答案 6 :(得分:-2)

   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