Qual é a melhor maneira de retornar a parte do número inteiro de um decimal (em c #)? (Isso deve funcionar para números muito grandes que podem não caber em um int).
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
O objetivo disso é: Estou inserindo em um campo decimal (30,4) no banco de dados e quero garantir que não tento inserir um número que seja muito longo para o campo. Determinar o comprimento da parte do número inteiro do decimal faz parte desta operação.
Respostas:
A propósito, pessoal, (int) Decimal.MaxValue irá estourar. Você não pode obter a parte "int" de um decimal porque o decimal é muito grande para ser colocado na caixa int. Acabei de verificar ... é até muito grande para um longo (Int64).
Se você quiser que o bit de um valor decimal fique à ESQUERDA do ponto, você precisa fazer o seguinte:
e retorna o valor como ... A DECIMAL ou DOUBLE.
editar: Truncar é definitivamente a função correta!
fonte
Acho que System.Math.Truncate é o que você está procurando.
fonte
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, o que pode ser uma surpresa, mas faz muito sentido .
Seu elenco explícito fará:
int intPart = (int)343564564.5 // intPart will be 343564564 int intPart = (int)343564565.5 // intPart will be 343564566
Pela maneira como você formulou a pergunta, parece que não é isso o que você deseja - você sempre quer reformular.
Eu faria:
Verifique também o tamanho dos seus
decimal
- eles podem ser bem grandes, então você pode precisar usar along
.fonte
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 quiser um certo comportamento para números negativos) é a função desejada.
fonte
Maneira muito fácil de separar o valor e seu valor da parte fracionária.
double d = 3.5; int i = (int)d; string s = d.ToString(); s = s.Replace(i + ".", "");
s é a parte fracionária = 5
ei é o valor como inteiro = 3
fonte
(int)Decimal.MaxValue
vai transbordar.Espero te ajudar.
/// <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)); }
fonte
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
fonte
decimal
é muito maior do que o deint
. Além disso, esta não é uma pergunta do VB.