¿Cómo convertir un doble a largo sin lanzar?

4 minutos de lectura

¿Cuál es la mejor manera de convertir un doble en largo sin lanzar?

Por ejemplo:

double d = 394.000;
long l = (new Double(d)).longValue();
System.out.println("double=" + d + ", long=" + l);

  • solo asegúrese de no operar con dobles más de 2 ^ 54 o los números no encajarán en el fracciónpor ejemplo, expresiones como myLong == (long)(myDouble + 1) dónde myLong es igual myDouble evaluará a true

    – Vitali Fedorenko

    26 de enero de 2012 a las 23:55

  • Este método ( Double.longValue(); ) sigue siendo útil si tiene valores dobles de cosas como una lista de matrices como esta ArrayList<Double> ya que obtendrá un error can’t cast. Solo digo esto para cualquiera que haya venido aquí y haya tenido un problema ligeramente diferente.

    – SARose

    30 de diciembre de 2014 a las 7:19


Suponiendo que esté contento con truncar hacia cero, simplemente emita:

double d = 1234.56;
long x = (long) d; // x = 1234

Esto será más rápido que ir a través de las clases contenedoras y, lo que es más importante, es más legible. Ahora, si necesita un redondeo que no sea “siempre hacia cero”, necesitará un código un poco más complicado.

  • Gran respuesta: la parte hacia cero habría sido incorrecta para mi aplicación, así que aplausos por resaltar esto en su respuesta y recordarle a mi cerebro con resaca que use Math.round() aquí en lugar de solo lanzar.

    – Ballena Fantasma

    9 de diciembre de 2011 a las 4:54

avatar de usuario
Johannes Schaub – litb

… Y aquí está la forma de redondeo que no se trunca. Me apresuré a buscarlo en el Manual de la API de Java:

double d = 1234.56;
long x = Math.round(d); //1235

  • No da el mismo resultado que un yeso. Así que depende de lo que Rich quiera hacer.

    – Cyrille Ka

    26 de noviembre de 2008 a las 17:50

  • sí. se pensó como una adición a lo que dijo Jon 🙂

    – Johannes Schaub – litb

    26 de noviembre de 2008 a las 17:53

  • Me gusta esto porque también funciona con objetos Double y Long en lugar de tipos primitivos.

    – themanatuf

    7 mayo 2012 a las 17:18

avatar de usuario
Leops

El enfoque preferido debería ser:

Double.valueOf(d).longValue()

Desde el Documentación doble (Java Platform SE 7):

Double.valueOf(d)

Devuelve un Double instancia que representa lo especificado double valor. si un nuevo Double no se requiere instancia, este método generalmente debe usarse en preferencia al constructor Double(double)ya que es probable que este método produzca un rendimiento de espacio y tiempo significativamente mejor al almacenar en caché los valores solicitados con frecuencia.

  • Esto es más conveniente que la respuesta aceptada.

    – DJphy

    7 oct 2021 a las 11:17

(new Double(d)).longValue() internamente solo hace un lanzamiento, por lo que no hay razón para crear un objeto Doble.

La biblioteca Guava Math tiene un método especialmente diseñado para convertir un doble en un largo:

long DoubleMath.roundToLong(double x, RoundingMode mode)

Puedes usar java.math.RoundingMode para especificar el comportamiento de redondeo.

Si tiene una fuerte sospecha de que el DOBLE es en realidad un LARGO y desea

1) controlar su valor EXACTO como LARGO

2) lanza un error cuando no es LARGO

puedes intentar algo como esto:

public class NumberUtils {

    /**
    * Convert a {@link Double} to a {@link Long}.
    * Method is for {@link Double}s that are actually {@link Long}s and we just
    * want to get a handle on it as one.
    */
    public static long getDoubleAsLong(double specifiedNumber) {
        Assert.isTrue(NumberUtils.isWhole(specifiedNumber));
        Assert.isTrue(specifiedNumber <= Long.MAX_VALUE && specifiedNumber >= Long.MIN_VALUE);
        // we already know its whole and in the Long range
        return Double.valueOf(specifiedNumber).longValue();
    }

    public static boolean isWhole(double specifiedNumber) {
        // http://stackoverflow.com/questions/15963895/how-to-check-if-a-double-value-has-no-decimal-part
        return (specifiedNumber % 1 == 0);
    }
}

Long es un subconjunto de Double, por lo que puede obtener algunos resultados extraños si, sin saberlo, intenta convertir un Double que está fuera del rango de Long:

@Test
public void test() throws Exception {
    // Confirm that LONG is a subset of DOUBLE, so numbers outside of the range can be problematic
    Assert.isTrue(Long.MAX_VALUE < Double.MAX_VALUE);
    Assert.isTrue(Long.MIN_VALUE > -Double.MAX_VALUE); // Not Double.MIN_VALUE => read the Javadocs, Double.MIN_VALUE is the smallest POSITIVE double, not the bottom of the range of values that Double can possible be

    // Double.longValue() failure due to being out of range => results are the same even though I minus ten
    System.out.println("Double.valueOf(Double.MAX_VALUE).longValue(): " + Double.valueOf(Double.MAX_VALUE).longValue());
    System.out.println("Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + Double.valueOf(Double.MAX_VALUE - 10).longValue());

    // casting failure due to being out of range => results are the same even though I minus ten
    System.out.println("(long) Double.valueOf(Double.MAX_VALUE): " + (long) Double.valueOf(Double.MAX_VALUE).doubleValue());
    System.out.println("(long) Double.valueOf(Double.MAX_VALUE - 10).longValue(): " + (long) Double.valueOf(Double.MAX_VALUE - 10).doubleValue());
}

avatar de usuario
diablo

Simplemente por lo siguiente:

double d = 394.000;
long l = d * 1L;

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad