我从数据库连接SQL语句中获得了类似于以下内容的结果:
[{"BALANCE":111.11},{"BALANCE":222.12},{"BALANCE":444.30}]
我使用表达式节点的以下内容来计算总和:
sum = 0;
foreach (row : message.payload) {
sum += row['BALANCE'];
}
message.payload = sum;
这不太合适,但请注意下面返回的数字变量没有引号
777.5299999999999994315658113919199
从前一个帖子的优秀答案中,我切换到以下表达式节点内容:
sum = 0;
foreach (row : message.payload) {
sum += row['BALANCE'];
}
message.payload = new java.text.DecimalFormat("#.##").format(sum);
这导致了以下准确结果:
"777.53"
我唯一的问题是它在数字周围有引号。如何消除报价?
由于
答案 0 :(得分:1)
您可以尝试将总和转换为BigDecimal,然后将其上的比例设置为2.
message.payload = new BigDecimal(sum).setScale(2,java.math.RoundingMode.CEILING)
这会将您的有效负载保持为数字而不是字符串。
希望这有帮助。
答案 1 :(得分:1)
您问题的真正解决方法如下:不使用浮点数来存储货币金额。这很容易出现舍入错误(正如您在上面所经历过的那样),事实证明人们不喜欢在这里和那里失去分数。
有关详情,请阅读https://stackoverflow.com/a/3730040/387927。
因此,修复数据库只存储整数,例如以美分111111
代替111.11
,并且只对这些分数执行整数计算。
或者查看数据库查询以返回java.math.BigDecimal
个实例,而不是它似乎正在返回的floats
或doubles
。那样你就不会有任何不利的四舍五入的伎俩。
任何其他方法,您首先要通过有损浮点数据类型然后执行舍入(如在用户1760178的答案中),将使您面临舍入问题。