Json Mule ESB,从表达式节点格式化十进制格式

Json Mule ESB,从表达式节点格式化十进制格式,json,expression,mule,esb,Json,Expression,Mule,Esb,之前,我从数据库连接SQL语句中得到一个类似于以下内容的结果: [{"BALANCE":111.11},{"BALANCE":222.12},{"BALANCE":444.30}] 我使用表达式节点的以下内容来计算总和: sum = 0; foreach (row : message.payload) { sum += row['BALANCE']; } message.payload = sum; 这并没有完全解决问题,但请注意,下面返回的数值变量周围没有引号 777.52999999

之前,我从数据库连接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"
我唯一的问题是它在数字周围有引号。如何消除引号


谢谢

您可以尝试将总和转换为BigDecimal,然后将其比例设置为2

message.payload = new BigDecimal(sum).setScale(2,java.math.RoundingMode.CEILING)
这将使您的有效负载保持为数字而不是字符串


希望这能有所帮助。

解决您问题的真正办法是:不要使用浮点数存储货币金额。这很容易出现舍入错误(正如您在上面所经历的),结果是人们不喜欢在这里或那里损失美分

阅读更多关于此的信息

因此,请将数据库修复为仅存储整数,例如以美分为单位,
111111
而不是
111.11
,并仅对这些美分执行整数计算

或者查看DB查询以返回
java.math.BigDecimal
实例,而不是它似乎返回的
floats
doubles
。那样你就不会有恶作剧了


任何其他方法,如果您首先检查有损浮点数据类型,然后执行舍入(如user1760178的回答),都会使您面临舍入问题。

您想要字符串还是数字?如果是数字,则第一个解是正确的。如果是字符串,则第二个为。