Что не так с отличной математикой? - PullRequest
1 голос
/ 20 июня 2011

Это кажется мне довольно странным и полностью ставит меня на сторону людей, желающих использовать обычную Java. При написании отличного приложения я столкнулся с такой вещью:

int filesDaily1 = (item.filesDaily ==~ /^[0-9]+$/) ?
            Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.'))

        def filesDaily = (item.filesDaily ==~ /^[0-9]+$/) ?
            Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.'))

Итак, зная, что item.filesDaily - это строка со значением '1 .. *', как это может быть, что filesDaily1 равен 49, а filesDaily равен 1?

Более того, при попытке сделать что-то вроде

int numOfExpectedEntries = filesDaily * item.daysToCheck

Исключение говорят, что

Cannot cast object '111' with class 'java.lang.String' to class 'int'

указывает на эту точную строку кода с умножением. Как это может произойти?

Ответы [ 2 ]

5 голосов
/ 20 июня 2011

Вы присваиваете это значение целому числу:

item.filesDaily.substring(0, item.filesDaily.indexOf('.'))

Я догадываюсь , что Groovy преобразует односимвольную строку «1» в символ «1»и затем беря значение Unicode в обычном преобразовании char-to-int ... так что в итоге вы получите значение 49.

Если вы хотите проанализировать строку как десятичное число, используйте вместо нее Integer.parseIntвстроенного преобразования.

Разница между filesDaily1 и filesDaily заключается в том, что вы сказали Groovy, что filesDaily1 означает int, поэтому он применяет преобразование к int.Я подозреваю, что filesDaily на самом деле строка "1" в вашем тестовом примере.

I подозреваю вы действительно просто хотите изменить код на что-то вроде:

String text = (item.filesDaily ==~ /^[0-9]+$/) ? items.filesDaily :
                   item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
Integer filesDaily = text.toInteger()
4 голосов
/ 20 июня 2011

Это ошибка в коде преобразования типа groovy.

int a = '1'
int b = '11'

возвращает разные результаты, потому что используются разные конвертеры. В примере a будет 49, а b будет 11. Почему?

Преобразование из одного символа в int (с использованием String.charAt(0)) имеет более высокий приоритет, чем анализатор целых чисел.

Плохая новость заключается в том, что это происходит со всеми односимвольными строками. Вы даже можете сделать int a = 'A', что даст вам 65.

Пока у вас нет возможности узнать, какова длина строки, вы должны использовать Integer.parseInt() вместо того, чтобы полагаться на автоматическое преобразование типов.

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