Как лучше всего конвертировать дабл в лонг без заброса?
Например:
double d = 394.000;
long l = (new Double(d)).longValue();
System.out.println("double = " + d + ", long = " + l);
Этот метод (Double.longValue();) по-прежнему полезен, если у вас есть двойные значения из таких вещей, как Arraylist, например ArrayList<Double>, поскольку вы получите ошибку «Невозможно преобразовать». Я просто говорю это всем, кто пришел сюда и столкнулся с другой проблемой.




Предполагая, что вы довольны усечением до нуля, просто введите:
double d = 1234.56;
long x = (long) d; // x = 1234
Это будет быстрее, чем при использовании классов-оболочек, и, что более важно, будет более читабельным. Теперь, если вам нужно округление, отличное от «всегда в сторону нуля», вам понадобится немного более сложный код.
Отличный ответ - стремление к нулю было бы неправильным для моего приложения, поэтому аплодисменты за выделение этого в вашем ответе и напоминание моему похмельному мозгу использовать здесь Math.round () вместо простого преобразования!
... А вот и способ округления, который не усекает. Поспешил поискать это в Руководстве по Java API:
double d = 1234.56;
long x = Math.round(d); //1235
Это не дает такого же результата, как отливка. Так что это зависит от того, что хочет делать богатый.
да уж. это было задумано как дополнение к тому, что сказал Джон :)
Мне это нравится, поскольку он также работает с объектами Double и Long, а не с примитивными типами.
(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
Doubleinstance representing the specifieddoublevalue. If a newDoubleinstance is not required, this method should generally be used in preference to the constructorDouble(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/…@ThariqNugrohotomo double может хранить более широкий диапазон числовой информации, чем long. Взгляните на разделы о long и double на этом сайт.
Просто следующим образом:
double d = 394.000;
long l = d * 1L;
просто убедитесь, что вы не работаете с числами в два раза больше, чем 2 ^ 54, иначе числа не поместятся в доля, поэтому, например, выражения типа
myLong == (long)(myDouble + 1), гдеmyLongравноmyDouble, будут оцениваться какtrue