今天终于把浮点数的格式化,以及进位做了一个比较详细的了解。
比如计算出来一个结果是:34576543.3456。
现在客户需要的格式是各种各样的,假设是¥34,576,543.35
拆解如下:
- 这是个货币,需要前面加上货币符号
- 需要千分位
- 需要保留2位小数,必须考虑到进位问题
这个里面用到2个知识点,一个是浮点数的格式化,我们一般用DecimalFormat;
一个是四舍五入,我们用RoundingMode.HALF_UP
先将上面的代码贴在下面:
public void testDecimalFormat(){
double a=34576543.3456;
DecimalFormat df=new DecimalFormat("###,##0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println("¥"+df.format(a));
}
下面分别讲解:
1、DecimalFormat正如SimpleDateFormat一样,需要接受一个表示格式的参数,这里是###,##0.00
这个格式参数是由#和0两位符号,以及,和.组成。
那么#和0到底有什么相同点和区别呢?
相同:
- 2者都表示数字
区别:
- #如果放在两端,那么碰到0,则0丢失。比如00333.3300,用#号表示两端的话,则是333.333
- 当不足时,用#是显示不了的。比如333,要想显示成333.00,用#号是无效的,只能用00
2、关于进位
DecimalFormat的进位默认是RoundingMode.HALF_EVEN,这个是银行家算法(在大量的计算时,误差最小),即如果被舍弃掉的部分的左边是偶数,则同HALF_DOWN;如果被舍弃掉的部分的左边是奇数,则同HALF_UP。
HALF_UP:即是中国的四舍五入。
HALF_DOWN:如果与两个相邻数字相等,则向下舍入,就这点和HALF_UP不同,别的同HALF_UP。
那我们这里比较习惯用四舍五入,所以直接用HALF_UP即可。
ps:#表示的是取整,如果#.00则表示的是带2位小数。
refurl:http://rainbow702.iteye.com/blog/1337529
http://jerval.iteye.com/blog/874983