Java Typecasting для получения целочисленной части типа double как double - PullRequest
1 голос
/ 01 декабря 2011

Я иногда склонен использовать (double) (long) (a * b / c), чтобы сохранить целую часть результата как double.Это хорошо работает и для отрицательных чисел.

Есть ли лучший способ добиться того же, что, как я считаю, приведение типов является дорогой операцией.число, а не округленное значение.Например:

MyObj.setDouble((double)(long)(522.99))
MyObj.getDouble() returns 522.0 and not 523.0

Спасибо.

Ответы [ 3 ]

4 голосов
/ 01 декабря 2011

Попробуйте Math.rint(double) или Math.round(double). Независимо от различий в производительности, это как минимум более четко и кратко.

[Изменить]

В ответ на ваш уточненный вопрос - «как мне получить целую часть двойного числа без приведения» (несмотря на то, что ваш заголовок спрашивает о округлении ), попробуйте следующее: *

public static double integerPart(double d) {
  return (d <= 0) ? Math.ceil(d) : Math.floor(d);
}
integerPart(522.99); // => 522d
integerPart(-3.19); // => -3d

Конечно, эта форма, вероятно, не быстрее, чем приведение, поскольку она использует сравнение и вызов метода.

0 голосов
/ 03 декабря 2011

Как насчет Math.floor(double) Я не вижу разницы между целочисленной частью и направлением ее вниз.

0 голосов
/ 01 декабря 2011

Производительность здесь не проблема.Но код (double)(long)(a*b/c) ужасен.На самом деле вам вообще не нужно кастинг, если вы присваиваете результат `двойной переменной:

double d = a*b/c; точно так же, как double d = (double)(long)a*b/c;

Вам фактически никогда не нужно выполнять кастинг при переходенижний верхний тип.Это верно для примитивов (например, int -> double) и для классов (например, ArrayList -> List).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...