Respostas:
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
double d = 1.234;
int i = Convert.ToInt32(d);
Manipula o arredondamento da seguinte forma:
arredondado para o número inteiro assinado de 32 bits mais próximo. Se o valor estiver na metade do caminho entre dois números inteiros, o número par será retornado; ou seja, 4,5 é convertido em 4 e 5,5 é convertido em 6.
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:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
Dependendo da arquitetura, é várias vezes mais rápido.
double d;
int rounded = (int)Math.Round(d);
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 downcasting int
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 downcast int
deve retornar o valor correto. (por exemplo (int)(1.8 + .5) == 2
)
+ 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_
int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}
Para o Unity, use Mathf.RoundToInt .
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
void Start()
{
// Prints 10
Debug.Log(Mathf.RoundToInt(10.0f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.2f));
// Prints 11
Debug.Log(Mathf.RoundToInt(10.7f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.5f));
// Prints 12
Debug.Log(Mathf.RoundToInt(11.5f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.0f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.2f));
// Prints -11
Debug.Log(Mathf.RoundToInt(-10.7f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.5f));
// Prints -12
Debug.Log(Mathf.RoundToInt(-11.5f));
}
}
public static int RoundToInt(float f) { return (int)Math.Round(f); }
Estou desenvolvendo uma calculadora científica que ostenta um botão Int. Eu descobri o seguinte é uma solução simples e confiável:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
À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.
Convert.ToInt32()
fará a mesma coisa ou simplesmente tira tudo após o decimal?