Pergunta

Como você converter um duplo para o int mais próximo?

Foi útil?

Solução

Use Math.round(), possivelmente em conjunto com MidpointRounding.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

Outras dicas

double d = 1.234;
int i = Convert.ToInt32(d);

Referência

alças de arredondamento assim:

arredondado para o número inteiro assinado de 32 bits mais próxima. Se o valor é metade entre dois números inteiros, o número par é retornado; isto é, 4,5 é convertido a 4, e 5,5 é convertido em 6.

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);

Eu sei que esta questão é antiga, mas me deparei com isso na minha busca para a resposta à minha pergunta similar. Eu pensei que eu iria partilhar a ponta muito útil que me foi dada.

Ao converter para int, basta adicionar 0,5 ao seu valor antes downcasting. Como downcasting para int sempre cai para o número mais baixo (por exemplo, (int) 1.7 = 1), se o seu número é 0,5 ou superior, adicionando 0,5 irá levá-la para o próximo número e sua abatida para int deve retornar o valor correto . (Por exemplo (int) (1,8 + 0,5) = 2)

Espero que esta resposta é útil a ninguém.

Para 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));
    }
}

Fonte

public static int RoundToInt(float f) { return (int)Math.Round(f); }

Estou desenvolvendo uma calculadora científica que o esporte um botão Int. Eu encontrei o seguinte é uma solução simples e confiável:

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

Math.Round às vezes produz resultados inesperados ou indesejáveis ??e conversão explícita para inteiro (via fundido ou Convert.ToInt ...) muitas vezes produz valores errados para os números de maior precisão. O método acima parece sempre trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top