Pergunta

O que é a melhor maneira para retornar a parte inteira de um decimal (em c #)? (Isto tem que trabalhar para números muito grandes que não podem caber em um int).

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

O objetivo deste é: eu estou inserindo em um decimal campo (30,4) no db, e queremos garantir que eu não tente inserir um número que é demasiado longo para o campo. Determinar o comprimento de todo o número de peça do decimal faz parte desta operação.

Foi útil?

Solução

Pela forma como caras, (int) Decimal.MaxValue vai transbordar. Você não pode obter a parte "int" de um decimal, porque o decimal é muito friggen grande para colocar na caixa de int. Verifiquei apenas ... é mesmo muito grande para um longo (Int64).

Se quiser que o bit de um valor decimal para a esquerda do ponto, você precisa fazer o seguinte:

Math.Truncate(number)

e retornar o valor como ... um decimal ou um duplo.

Editar: truncar é definitivamente a função correta

Outras dicas

System.Math.Truncate é o que você está procurando.

depende do que você está fazendo.

Por exemplo:

//bankers' rounding - midpoint goes to nearest even
GetIntPart(2.5) >> 2
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -6

ou

//arithmetic rounding - midpoint goes away from zero
GetIntPart(2.5) >> 3
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -7

O padrão é sempre o primeiro, que pode ser uma surpresa, mas faz muito bom senso .

A sua conversão explícita vai fazer:

int intPart = (int)343564564.5
// intPart will be 343564564

int intPart = (int)343564565.5
// intPart will be 343564566

Do jeito que você formulada a questão parece que isso não é o que você quer -. Você quer andar-lo cada vez

eu faria:

Math.Floor(Math.Abs(number));

Além disso, verifique o tamanho do seu decimal -. Eles podem ser bastante grande, então você pode precisar usar um long

Você só precisa lançá-lo, como tal:

int intPart = (int)343564564.4342

Se você ainda quiser usá-lo como um decimal em cálculos posteriores, então Math.Truncate (ou possivelmente Math.Floor se você quiser um determinado comportamento para números negativos) é a função que deseja.

Muito fácil maneira de valor separado e seu valor parte fracionária.

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

s é fracionário parte = 5 e
i é o valor de um número inteiro = 3

Espero ajudá-lo.

/// <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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top