Melhor maneira de obter o número inteiro parte de um número decimal
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.
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 ??em>
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