Spring 表达式 (SpEL) - 四舍五入
Spring Expression (SpEL) - Rounding
在使用 SpEL 评估数学运算时,有没有办法指定舍入精度?
例如
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("2/3");
exp.getValue(Double.class); //returns 0.0 instead of 0.666666667
或者这是 SpEL 的限制?
谢谢
这对我有用:
"2.0/3"
结果是 0.6666666666666666
.
有道理吗?
getValue(Double.class)
的要点在这里被删除了,因为你的 2/3
只是两个整数之间的运算,结果也是一个整数 - 0
。
只有在那之后,这个结果才被转换为预期的双精度值作为 0.0
.
您需要在表达式中明确说明您将要处理双打。
您可能认为这是一个限制,但 getValue(Double.class)
不是像 Java 中那样的 casting 操作。这是一个 post 转换。因此,精度会丢失,因为您的表达式无论如何都会计算为整数。
这适用于搜索“SpEL 舍入精度”的像我这样的搜索者。如果您已经在 script/expression 中使用它,例如 {{car.price}},您可以添加 .doubleValue()。所以它将是 {{car.price.doubleValue()}},您也可以执行 {{car.price.doubleValue()+conditioner.price.doubleValue()}}。它提供了更高的精度..
在使用 SpEL 评估数学运算时,有没有办法指定舍入精度? 例如
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("2/3");
exp.getValue(Double.class); //returns 0.0 instead of 0.666666667
或者这是 SpEL 的限制?
谢谢
这对我有用:
"2.0/3"
结果是 0.6666666666666666
.
有道理吗?
getValue(Double.class)
的要点在这里被删除了,因为你的 2/3
只是两个整数之间的运算,结果也是一个整数 - 0
。
只有在那之后,这个结果才被转换为预期的双精度值作为 0.0
.
您需要在表达式中明确说明您将要处理双打。
您可能认为这是一个限制,但 getValue(Double.class)
不是像 Java 中那样的 casting 操作。这是一个 post 转换。因此,精度会丢失,因为您的表达式无论如何都会计算为整数。
这适用于搜索“SpEL 舍入精度”的像我这样的搜索者。如果您已经在 script/expression 中使用它,例如 {{car.price}},您可以添加 .doubleValue()。所以它将是 {{car.price.doubleValue()}},您也可以执行 {{car.price.doubleValue()+conditioner.price.doubleValue()}}。它提供了更高的精度..