【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片(二)

三. 格式化浮点数


如何在程序中保留一个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的方向舍入.

上一篇:【Android 应用开发】BluetoothAdapter解析(三)


下一篇:【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )