我将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}
答案 0 :(得分:1)
您的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类型,可能会导致错误的输出。