DecimalFormat之RoundingMode

0x81 格式化数字

格式化数字的方法其实有很多,而DecimalFormat是比较常用的一种方式,它可以将我们的数字格式化成pattern规定的样子,比如123.4根据”#,##.00”格式化成1,23.40。

0x82 格式化数字的精度取舍问题

这个问题其实比较常见,但是如果遇到取小于当前数字的最大整数这种状况,我们有的时候会对数字提前进行floor/round操作,然后再格式化输出该数字,其实DecimalFormat本身提供RoundingMode来满足我们的这些需求。还有一种状况,很多人可能遇见过,就是对于x.5这种状况,格式化后的数字有时候总是偶数,也就是说整数位是奇数会入,整数位是偶数则会舍,其实这都是RoundingMode决定的。

0x83 RoundingMode

Math#round操作也是我们日常开发中比较常用的操作,而RoundingMode也就是决定了精度取舍方式,毕竟中西方在某些问题的处理上观念是不一样的,RoundingMode提供了很多种选项来应对不同的场景:

  1. UP
    远离0方向舍入方式,意思是入位后绝对值永远大于原数字绝对值,1.6/1.5/1.1=>2 || -1.1/-1.5/-1.6=>-2

  2. DOWN
    靠近0方向舍入方式,与UP刚好相反,1.6/1.5/1.1=>1 || -1.1/-1.5/-1.6=>-1

  3. CEILING
    正方向舍入方式,即大于0入位,小于0舍位,1.6/1.5/1.1=>2 || -1.1/-1.5/-1.6=>-1

  4. FLOOR
    负方向舍入方式,与CEILING相反,1.6/1.5/1.1=>1 || -1.1/-1.5/-1.6=>-2

  5. HALF_UP
    四舍五入方式,最符合国人习惯,舍弃部分>=0.5同UP,否则同DOWN,1.6/1.5=>2 || 1.1=>1 || -1.1=>-1 || -1.5/-1.6=>-2

  6. HALF_DOWN
    依然是像最接近的数字舍入,舍弃部分>0.5同UP,否则同DOWN,1.6=>2 || 1.5/1.1=>1 || -1.1/-1.5=>-1 || -1.6=>-2

  7. HALF_EVEN
    默认模式,像最近的偶数舍入,服从所谓的“银行家舍入法”

舍入模式主要就这么多,自己写个UnitTest就明白了~