Переход от Groovy к Java - PullRequest
       14

Переход от Groovy к Java

4 голосов
/ 21 июля 2010

В моем проекте grails я перевожу все вычисления в классы java.

Вот ссылка на исходный код (я сохранил его в Документах Google).

Основная цель - отформатировать текущее время в строку (на двух языках).Примеры:

1 day 2 hours 3 seconds
1 день 2 часа 3 секунды

Но у меня есть один метод:

 private static boolean endsWith(final long num, final long part) {
    if (num / 10 < 1) {
      return num == part;
    } else {
      float val1 = (num - part) / 10;
      float val2 = (float) Math.floor(val1);

      return val1 == val2;
    }
  }

Он проверяет, заканчивается ли 'num' на 'part'.Примеры:

assert endsWith(128, 1) == false
assert endsWith(1, 1) == true
assert endsWith(34, 4) == true

PS num - стандартное значение long (java.lang.Long), а part - больше 0 и меньше или равно 9 (1..9).

Но этот код отлично работает только в классных классах.

В java классах я получил такие результаты:

endsWith(7, 7) == true
endsWith(23, 3) == false
endsWith(23, 1) == true

Как я могу видеть из gant log - весь код компилируется groovyc .

PS2 Я скомпилирую этот код с помощью groovyc и javac для сравнения результатов.Потому что, если я не ошибаюсь, это может быть ошибка в groovyc .Но это моя ошибка, я надеюсь:)

Ответы [ 3 ]

8 голосов
/ 21 июля 2010

Почему вы вообще используете арифметику с плавающей запятой? Почему бы просто:

private static boolean endsWith(final long num, final long part) {
  return (num % 10) == part;
}

? Если он должен работать для отрицательных чисел, вам нужно принять абсолютное значение перед модом, но в противном случае это должно быть хорошо.

6 голосов
/ 21 июля 2010

Вы никогда не должны сравнивать значения с плавающей запятой с == из-за ограниченной точности.

На самом деле в этом случае не похоже, что вам вообще нужно переходить к операции с плавающей запятой. Вы можете использовать %, чтобы получить остаток от номера и получить последние несколько цифр таким образом.

Вот несколько примеров (обратите внимание на знак с отрицательным дивидендом)

123 % 10 == 3
4567 % 100 == 67
-9876 % 10 == -6

Ссылки

Похожие вопросы


String альтернатива операции

Другой вариант заключается в том, что если производительность не очень важна, возможно, самое простое решение - просто преобразовать в String и использовать String.endsWith. Таким образом, у вас также не возникает сложностей с отрицательными числами.

System.out.println(String.valueOf(-9876).endsWith(String.valueOf(76)));
// prints "true"
3 голосов
/ 21 июля 2010

Я не уверен, но меня не устраивают ваши преобразования для плавания ...

Не могли бы вы просто использовать return (num% 10) == part?

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