显示格式的四舍六入五成双

 

一、问题描述

    若单元格内的信息为数值,可能需要使用单元格的“显示格式”这个属性来对数据进行相应位数的舍入。
由于该功能使用了 java 中的 java.text.DecimalFormat 这个类(使用了欧美金融业界常用的四舍六入无成双的规则)来实现相关的需求。其中有个陷阱(四舍六入无成双并不是 bug)需要提醒使用该属性的用户。

二、解决思路

在使用显示格式的时候,同时去使用自带函数 round() 来将“四舍六入”变为“四舍五入”。

三、实现步骤

打开一张空白报表,在任意单元格中,本例使用 A1 单元格,输入 9.8250,并将其显示格式设置为 #0.00,可以看到预览结果为 9.82,而非我们传统观念中的四舍五入后的结果:9.83。

这是因为显示格式该功能的实现使用了 java.text.DecimalFormat,而 java.text.DecimalFormat 在设计的时候使用了“四舍六入五成双”的观念。若要使用四舍五入可以在单元格中使用 round 函数:=round(9.825,2),再次预览结果,发现结果变为 9.83。

四、结尾总结

需要注意单元格属性中的显示格式对数值的舍入并非是“四舍五入”,而是“四舍六入五成双”的规则。若忽视这点,会对终端的客户带来不便或是一些不必要的麻烦。

同时,我们会发现,当数据是 1.15375 设置显示格式是 #.#### 时,显示的结果是 1.1538
这是因为 JDK 版本差异导致的情况。

DecimalFormat fmt2 = new DecimalFormat("0.0000");  
fmt2.setRoundingMode(RoundingMode.HALF_UP);  
System.out.println( fmt2.format(1.15375));  
System.out.println( fmt2.format(0.15375));

imagepng
此差异在做表的时候需要注意下即可。

只有极个别的数据会出现这样的情况,是由于 JDK 差异引起的 并非 BUG。