三. 格式化浮点数
如何在程序中保留一个float或者double浮点数的小数位数 , 这里可以使用以下几种方法 :
1.使用DecimalFormat格式化浮点数
首先创建一个DecimalFormat类 , 这个类可以 按照一定的格式化数字来格式化浮点数. 常见的格式化字符是"#" , "0" .
创建该类的时候 , 将格式化的格式传入 , 例如如果要保存两位小数 , 就传入 "#.00" , 以此类推 .
创建了DecimalFormat对象之后 , 调用该对象的format对象 , 将需要格式化的浮点数传入这个方法 , 返回的结果就是格式化之后的固定位数的浮点数的字符串形式 .
注意 : 这种方法格式化之后的浮点数对象是字符串形式 , 如果之后需要使用这个浮点数进行计算 , 就需要使用BigDecimal进行实现的这种方法 ;
精确度问题 : DecimalFormat使用的是half-even舍入法, 这个不是四舍五入方法, 当出现5的时候,就会向最近的偶数靠近.
例如 : System.out.println(new java.text.DecimalFormat("0.00").format(3.135)); 5最近的偶数是4, 打印的结果就是3.14;
System.out.println(new java.text.DecimalFormat("0.00").format(3.125)); 5最近的偶数是2, 打印的结果就是3.12;
float pi = 3.1415926f; DecimalFormat decimalFormat = new DecimalFormat("#.00"); String formatData = decimalFormat.format(pi); System.out.println(formatData); System.out.println(new DecimalFormat("#.00").format(pi));
2.利用BigDecimal实现
创建一个BigDecimal对象 , 创建的时候 , 传入需要格式化的浮点数 , new BigDecimal(float) ;
调用这个BigDecimal的setScale方法 , 这个方法传入的参数 : 需要保留的小数位数 , BigDecimal.ROUND_HALF_UP常量 , 之后调用这个常量对应的将BigDecimal转为浮点数的方法 , 得到的结果为转化好的浮点数 .
float pi = 3.1415926f; BigDecimal bigDecimal = new BigDecimal(pi); float result = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); System.out.println(result);
与浮点数有关的构造方法 : 可以向构造方法中传入浮点数 或者 字符串 , 这里需要注意的是 , 使用浮点数的构造方法不精确 , 这个值最后会有不该有的数据,尽量使用字符串的构造方法.
例如 :
BigDecimal bd1=new BigDecimal(0.05); System.out.println(bd1.toString()); BigDecimal bd2=new BigDecimal("0.05"); System.out.println(bd2.toString());
结果是 :
0.05000000000000000277555756156289135105907917022705078125 0.05
因此使用字符串的构造函数,获得的数据更精确.
BigDecimal的基本方法 : 加法 add , 减法 subtract, 乘法 multiply, divide 除法, setScale四舍五入.
加法计算 :
BigDecimal bd3=new BigDecimal(String.valueOf(0.05)); BigDecimal bd4=new BigDecimal(String.valueOf(0.01)); System.out.println((bd3.add(bd4)).doubleValue());
减法计算 :
BigDecimal bd5=new BigDecimal(String.valueOf(0.05)); BigDecimal bd6=new BigDecimal(String.valueOf(0.01)); System.out.println((bd5.subtract(bd6)).doubleValue());
乘法计算 :
BigDecimal bd7=new BigDecimal(String.valueOf(0.05)); BigDecimal bd8=new BigDecimal(String.valueOf(0.01)); System.out.println((bd7.multiply(bd8)).doubleValue());
除法计算 :
//这里没有考虑数据错误的可能情况
//定义了精确位数
int scale=10; BigDecimal bd9=new BigDecimal(String.valueOf(0.05)); BigDecimal bd10=new BigDecimal(String.valueOf(0.03)); System.out.println((bd9.divide(bd10,scale,BigDecimal.ROUND_HALF_EVEN)).doubleValue());
四舍五入:
//四舍五入
scale=4;
BigDecimal bd11=new BigDecimal(String.valueOf(3.1415926));
System.out.println(bd11.setScale(scale,BigDecimal.ROUND_HALF_UP).toString());
四舍五入的精确模式 :
ROUND_CEILING : 向正无穷方向舍入 .
ROUND_DOWN : 向零方向舍入
ROUND_FLOOR : 向负无穷方向射舍入
ROUND_HALF_DOWN : 向距离近的一方舍入 , 如果两边相等 , 向下舍入 , 例如 2.155 , 保留2位小数的话 是 2.15;
ROUND_HALF_UP : 向距离近的一方舍入 , 如果两边相等 , 向上舍入 , 例如 2.155,保留两位小数的话 是 2.16; 这个就是四舍五入
ROUND_HALF_EVEN : 向距离近的一方舍入 , 如果两边距离相等 , 如果保留位是奇数位 使用ROUND_HALF_UP , 如果保留位是偶数位,使用ROUND_HALF_DOWN;
ROUND_UNNECESSARY : 精确的计算 , 不需要舍入 .
ROUND_UP : 向远离0的方向舍入.