Деление двух чисел в freemarker - неверный результат - PullRequest
0 голосов
/ 28 августа 2018

Я использую freemarker 2.3.26 с Kotlin. У меня есть две переменные в моем шаблоне, и мне нужно разделить их.

Variable ${a} is Int and its value is 28.
Variable ${b} is Int and its value is 5.
Output of ${a/b} should be 5, but really it is 6. 

Я обнаружил, что это, вероятно, вызвано округлением

28/5 = 5.6 = rounds to 6

Как правильно с этим справиться? Есть ли другой, более элегантный способ, чем этот?

${(a/b)?floor}

1 Ответ

0 голосов
/ 28 августа 2018

Ваш number_format параметр конфигурации должен быть примерно таким же, как '0', поэтому десятичные дроби теряются , когда число преобразуется в строку . Я бы никогда не использовал такой number_format, потому что это сбивает с толку и все. С обычными number_format, такими как '0.####', вы получаете 5.6, потому что 5/6 - это действительно 5.6, и если вам нужно уточнить это, то вам нужно быть откровенным об этом. Теперь, если вы уверены, что хотите удалить десятичные дроби во время форматирования (но, опять же, я думаю, что это опасная практика), тогда используйте number_format как '0;;roundingMode=floor' (начиная с FreeMarker 2.3.24), а затем ${28/5} будет печать 5.

Другое, возможно, лучшее решение состоит в том, что если оба числа имеют целочисленные типы Java, то вы выполняете целочисленное деление (например, Java). Это возможно, если установить для конфигурации arithmetic_engine значение conservative. Это опять-таки не очень хорошая практика, потому что язык шаблонов не объявляет тип переменных, поэтому не очевидно, что будет делать a/b. По мере развития модели данных и перехода с BigDecimal на целочисленный тип Java, это может привести к неправильному выводу.

...