Как лучше всего конвертировать дабл в лонг без заброса?
Например:
double d = 394.000;
long l = (new Double(d)).longValue();
System.out.println("double=" + d + ", long=" + l);
Как лучше всего конвертировать дабл в лонг без заброса?
Например:
double d = 394.000;
long l = (new Double(d)).longValue();
System.out.println("double=" + d + ", long=" + l);
Предполагая, что вы довольны усечением до нуля, просто введите:
double d = 1234.56;
long x = (long) d; // x = 1234
Это будет быстрее, чем при использовании классов-оболочек, и, что более важно, будет более читабельным. Теперь, если вам нужно округление, отличное от «всегда в сторону нуля», вам понадобится немного более сложный код.
... А вот и способ округления, который не усекает. Поспешил поискать это в Руководстве по Java API:
double d = 1234.56;
long x = Math.round(d); //1235
Предпочтительный подход должен быть:
Double.valueOf(d).longValue()
Из Double (Java Platform SE 7) документация:
Double.valueOf(d)
Возвращает экземпляр
Double
, представляющий указанное значениеdouble
. Если новый экземплярDouble
не требуется, этот метод обычно следует использовать вместо конструктораDouble(double)
, поскольку этот метод, вероятно, даст значительно лучшую пространственную и временную производительность за счет кэширования часто запрашиваемых значений.
(new Double(d)).longValue()
внутри просто выполняет приведение, поэтому нет причин создавать объект Double.
В библиотеке Guava Math есть метод, специально разработанный для преобразования двойного числа в длинное:
long DoubleMath.roundToLong(double x, RoundingMode mode)
Вы можете использовать java.math.RoundingMode
, чтобы указать поведение округления.
Если у вас есть сильное подозрение, что ДВОЙНОЙ на самом деле ДЛИННЫЙ, и вы хотите
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/
- person Thariq Nugrohotomo; 15.11.2018
double
может хранить более широкий диапазон числовой информации, чем long
. Ознакомьтесь с разделами о long
и double
на этом сайте.
- person Tech Expert Wizard; 30.10.2020
Просто следующим образом:
double d = 394.000;
long l = d * 1L;
Проще говоря, приведение типов более эффективно, чем создание объекта Double.
myLong == (long)(myDouble + 1)
, гдеmyLong
равноmyDouble
, будут оцениваться какtrue
- person Vitalii Fedorenko   schedule 27.01.2012Double.longValue();
) по-прежнему полезен, если у вас есть двойные значения из таких вещей, как Arraylist, подобного этомуArrayList<Double>
, поскольку вы получите ошибку Невозможно преобразовать. Я просто говорю это всем, кто пришел сюда и столкнулся с другой проблемой. - person SARose   schedule 30.12.2014