我正在AWS AppSync中创建一个解析器响应映射,用于执行数学计算并以浮点形式返回百分比值:
#set( $result = $ctx.source.total * 100 / 365000 )
$result
然而,VTL每次都将其四舍五入到最接近的整数,如1.0
、2.0
等。
给定5000 * 100 / 365000
:
预期-1.36
结果-1.0
我能做到这一点吗?还是我需要考虑使用Lambda(对于如此简单的东西来说,这感觉有些过头了(。
问题是,VTL将$ctx.source.total
、100
和365000
都视为整数(java.lang.Integer(。
VTL确实通过java.lang.Double支持浮点数字。双精度而非整数的VTL语法只是100.0
而不是100
。
如果赋值中的任何数字是双精度的,则$result
将是双精度。
所以你可以这样做,得到1.36986301369863
:
#set( $result = $ctx.source.total * 100.0 / 365000 )
以下是一些示例和示例输出的链接:
https://mappingtool.dev/app/appsync/3d44255e560fa075b45bfa08afbb6fe4
在上面的例子中,结果将是1.0,因为1.36被四舍五入为1.0。要以浮点形式返回结果,可以使用Math.round((函数并将结果除以100:
#set( $result = Math.round($ctx.source.total * 100 / 365000) / 100 )
$result
这将以小数点后2位的浮点形式返回结果。
要解决此问题,不使用Lambda,也不使用Math.round((函数,可以使用以下VTL:
#set( $result = $ctx.source.total * 100 / 365000 )
#set( $result = $util.parseJson($util.toJson($result)) )
$result
这将以小数点后2位的浮点形式返回结果。