Freemarker中两个数字的除法-错误的结果

时间:2018-08-28 08:44:27

标签: syntax configuration freemarker

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