1

不知道是不是我一个人,但是

<fmt:formatNumber var="roundedNumber" value="2.5" type="number" pattern="#" />

给我

<%-- ${roundedNumber} == 2 --%>

你知道为什么 formatNumber 不四舍五入到 3 吗?

更新

似乎如果数字是奇数,则正确舍入,但如果是偶数,则不是。

2.5 will be rounded 2
2.51 will be rounded 3
3.5 will be rounded 4
3.51 will be rounded 4
4.5 will be rounded 4
4.51 will be rounded 5
... etc
4

1 回答 1

7

我认为原因可能是容器对 JSTL 的实现,但同样的事情发生在我身上。

然后,我阅读了JavaServer Pages 标准标记库 1.0 版规范,在第 9.7 节 fmt:formatNumber中标题为描述的段落中说,通过模式属性指定的模式字符串必须遵循类 java.text.DecimalFormat 指定的模式语法。

因此,我查阅了java.text.DecimalFormat的 java 文档,并在标题为Rounding的部分中指出,默认情况下它使用RoundingMode.HALF_EVEN模式进行舍入。此模式向“最近邻居”舍入一个数字,除非两个邻居是等距的,在这种情况下,向偶数邻居舍入。

这就解释了为什么 2.5 轮到 2(最近的偶数邻居)和 3.5 轮到 4(最近的偶数邻居)。

于 2013-10-11T17:34:50.820 回答