Как превратить дабл в лонг без заброса?

Как лучше всего конвертировать дабл в лонг без заброса?

Например:

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

просто убедитесь, что вы не работаете с числами в два раза больше, чем 2 ^ 54, иначе числа не поместятся в доля, поэтому, например, выражения типа myLong == (long)(myDouble + 1), где myLong равно myDouble, будут оцениваться как true

Vitalii Fedorenko 27.01.2012 03:55

Этот метод (Double.longValue();) по-прежнему полезен, если у вас есть двойные значения из таких вещей, как Arraylist, например ArrayList<Double>, поскольку вы получите ошибку «Невозможно преобразовать». Я просто говорю это всем, кто пришел сюда и столкнулся с другой проблемой.

SARose 30.12.2014 10:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
198
2
340 831
8

Ответы 8

Предполагая, что вы довольны усечением до нуля, просто введите:

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

Это будет быстрее, чем при использовании классов-оболочек, и, что более важно, будет более читабельным. Теперь, если вам нужно округление, отличное от «всегда в сторону нуля», вам понадобится немного более сложный код.

Отличный ответ - стремление к нулю было бы неправильным для моего приложения, поэтому аплодисменты за выделение этого в вашем ответе и напоминание моему похмельному мозгу использовать здесь Math.round () вместо простого преобразования!

Phantomwhale 09.12.2011 08:54

... А вот и способ округления, который не усекает. Поспешил поискать это в Руководстве по Java API:

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

Это не дает такого же результата, как отливка. Так что это зависит от того, что хочет делать богатый.

Cyrille Ka 26.11.2008 20:50

да уж. это было задумано как дополнение к тому, что сказал Джон :)

Johannes Schaub - litb 26.11.2008 20:53

Мне это нравится, поскольку он также работает с объектами Double и Long, а не с примитивными типами.

themanatuf 07.05.2012 21:18

(new Double(d)).longValue() внутренне просто выполняет приведение, поэтому нет причин создавать объект Double.

Проще говоря, приведение типов более эффективно, чем создание объекта Double.

В библиотеке Guava Math есть метод, специально разработанный для преобразования двойного числа в длинное:

long DoubleMath.roundToLong(double x, RoundingMode mode)

Вы можете использовать java.math.RoundingMode, чтобы указать поведение округления.

Предпочтительный подход должен быть:

Double.valueOf(d).longValue()

Из Документация Double (Java Platform SE 7):

Double.valueOf(d)

Returns a Double instance representing the specified double value. If a new Double instance is not required, this method should generally be used in preference to the constructor Double(double), as this method is likely to yield significantly better space and time performance by caching frequently requested values.

Если у вас есть сильное подозрение, что ДВОЙНОЙ на самом деле ДЛИННЫЙ, и вы хотите

1) получить дескриптор его ТОЧНОГО значения как ДЛИННОГО

2) выдает ошибку, если это не ДЛИННЫЙ

вы можете попробовать что-то вроде этого:

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 - это подмножество Double, поэтому вы можете получить некоторые странные результаты, если неосознанно попытаетесь преобразовать Double, который находится за пределами диапазона 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());
}
Long is a subset of Double не точен. Количество значащих цифр для Long больше, чем для Double, поэтому некоторая информация, содержащаяся в Long, может быть потеряна при преобразовании в Double. Пример = tio.run/…
Thariq Nugrohotomo 15.11.2018 07:52

@ThariqNugrohotomo double может хранить более широкий диапазон числовой информации, чем long. Взгляните на разделы о long и double на этом сайт.

Tech Expert Wizard 30.10.2020 16:38

Просто следующим образом:

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

Другие вопросы по теме