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

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

Например:

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

person Community    schedule 26.11.2008    source источник
comment
просто убедитесь, что вы не работаете с числами, превышающими 2 ^ 54, иначе числа не поместятся в дробь, поэтому, например, такие выражения, как myLong == (long)(myDouble + 1), где myLong равно myDouble, будут оцениваться как true   -  person Vitalii Fedorenko    schedule 27.01.2012
comment
Этот метод (Double.longValue();) по-прежнему полезен, если у вас есть двойные значения из таких вещей, как Arraylist, подобного этому ArrayList<Double>, поскольку вы получите ошибку Невозможно преобразовать. Я просто говорю это всем, кто пришел сюда и столкнулся с другой проблемой.   -  person SARose    schedule 30.12.2014


Ответы (8)


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

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

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

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

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

double d = 1234.56;
long x = Math.round(d); //1235
person Johannes Schaub - litb    schedule 26.11.2008
comment
Это не дает такого же результата, как гипс. Так что это зависит от того, что хочет делать богатый. - person Cyrille Ka; 26.11.2008
comment
Ага. это было задумано как дополнение к тому, что сказал Джон :) - person Johannes Schaub - litb; 26.11.2008
comment
Мне это нравится, поскольку он также работает с объектами Double и Long, а не с примитивными типами. - person themanatuf; 07.05.2012

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

Double.valueOf(d).longValue()

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

Double.valueOf(d)

Возвращает экземпляр Double, представляющий указанное значение double. Если новый экземпляр Double не требуется, этот метод обычно следует использовать вместо конструктора Double(double), поскольку этот метод, вероятно, даст значительно лучшую пространственную и временную производительность за счет кэширования часто запрашиваемых значений.

person leogps    schedule 09.06.2014

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

person Michael Myers    schedule 26.11.2008

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

long DoubleMath.roundToLong(double x, RoundingMode mode)

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

person CyberPlayerOne    schedule 14.08.2012

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

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());
}
person CloudNinja    schedule 04.05.2015
comment
Long is a subset of Double неточно. Количество значащих цифр для Long больше, чем для Double, поэтому некоторая информация, содержащаяся в Long, может быть потеряна при преобразовании в Double. Пример = tio.run/ - person Thariq Nugrohotomo; 15.11.2018
comment
@ThariqNugrohotomo double может хранить более широкий диапазон числовой информации, чем long. Ознакомьтесь с разделами о long и double на этом сайте. - person Tech Expert Wizard; 30.10.2020

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

double d = 394.000;
long l = d * 1L;
person devll    schedule 10.09.2018

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

person Vijay Dev    schedule 26.11.2008