Como você converte um duplo no int mais próximo?
147
Use Math.round()
, possivelmente em conjunto comMidpointRounding.AwayFromZero
por exemplo:
Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
Convert.ToInt32()
fará a mesma coisa ou simplesmente tira tudo após o decimal?Referência
Manipula o arredondamento da seguinte forma:
fonte
Math.Round
quando ele retorna um int conforme necessário.[0,.5)
- para baixo e exatamente metade dos números -[.5,1)
- para cima. Arredondamento para até um pouco influencia até mesmo números, uma vez que arredonda(.5,1.5)
a 1, mas[1.5,2.5]
a 2.Você também pode usar a função:
Dependendo da arquitetura, é várias vezes mais rápido.
fonte
fonte
Sei que essa pergunta é antiga, mas me deparei com ela na busca pela resposta para minha pergunta semelhante. Eu pensei em compartilhar a dica muito útil que me foi dada.
Ao converter para int, basta adicionar
.5
seu valor antes da redução. Como o downcastingint
sempre cai para o número mais baixo (por exemplo(int)1.7 == 1
), se seu número for.5
maior ou igual, a adição.5
trará para o próximo número e seu downcastint
deve retornar o valor correto. (por exemplo(int)(1.8 + .5) == 2
)fonte
+ 0.5 * Math.Abs(d)
Os métodos em outras respostas são lançados
OverflowException
se o valor flutuante estiver fora do intervalo Int. https://docs.microsoft.com/pt-BR/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_fonte
Para o Unity, use Mathf.RoundToInt .
Fonte
fonte
Estou desenvolvendo uma calculadora científica que ostenta um botão Int. Eu descobri o seguinte é uma solução simples e confiável:
Às vezes, Math.Round produz resultados inesperados ou indesejáveis e a conversão explícita em número inteiro (via conversão ou Convert.ToInt ...) geralmente produz valores incorretos para números de maior precisão. O método acima parece sempre funcionar.
fonte