с учетом следующей строки
BigDecimal step = 10.0G**-1.0G
Groovy 1.7.5 возвращает неправильный
0.1000000000000000055511151231257827021181583404541015625
и Groovy 1.8 возвращает правильный
0.1
К сожалению, я хочу решить мою проблему в Grails. 1.4 с groovy 1.8 пока недостаточно стабилен (контроллеры не обновляются в режиме dev), а grails 1.3.7 поставляется с groovy 1.7.x
два вопроса:
я что-то не так делаю или это ошибка в 1.7.5?
как я могу избежать этого поведения? Я думаю, что BigDecimals идеально подходят для такого рода задач округления?
второе обновление: (забудьте первое обновление) -;
Теперь я немного запутался. кажется, что я получаю разные результаты каждый раз, когда я пытаюсь ....:
BigDecimal step = 10.0G**-1.0G
println step
возвращает 0.1000000000000000055511151231257827021181583404541015625
и
println 10.0G**-1.0G
возвращает
0.1
в обеих заводных версиях.
Но если вы просто поместите BigDec step = 10.0G**-1.0G
в groovyConsole и позволите консоли напечатать последний ответ, вы получите разные результаты для разных версий groovy. Так что, похоже, одна из проблем - это groovyConsole.
Другая проблема - преобразование toString, которое выполняется.
И похоже, что происходит некоторая автобокс ... когда я делаю
def step = 10.0G**-1.0G
В результате получается Double ...
Полагаю, проблема сводится к двум вопросам:
- a) какие математические операции являются операциями BigDecimal?
и
- б) как я могу легко округлить BigDecimal, чтобы я мог исправить вышеупомянутую проблему?
Спасибо за терпение