import java.math.BigDecimal;
/**
* BigDecimal类表示不可变的、任意精度的有符号十进制数
* BigDecimal类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换
* 如果对double符点数进行操作时,一定要使用String对象作为构造函数参数,而不是直接使用double数字;否则会发生精度丢失
* @author liyongyong
*
*/
public class TestBigDecimal {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal d1 = new BigDecimal("0.05"); //基于字符串
BigDecimal d2 = new BigDecimal(0.05); //基于double符点数
BigDecimal d3 = BigDecimal.valueOf(0.01);
System.err.println("下面使用String作为BigDecimal构造函数参数的计算结果:");
System.out.println("0.05 + 0.01 = " + d1.add(d3));
System.out.println("0.05 - 0.01 = " + d1.subtract(d3));
System.out.println("0.05 * 0.01 = " + d1.multiply(d3));
System.out.println("0.05 / 0.01 = " + d1.divide(d3));
System.err.println("下面使用Double作为BigDecimal构造函数参数的计算结果:");
System.out.println("0.05 + 0.01 = " + d2.add(d3)); //发生精度丢失
System.out.println("0.05 - 0.01 = " + d2.subtract(d3));
System.out.println("0.05 * 0.01 = " + d2.multiply(d3));
System.out.println("0.05 / 0.01 = " + d2.divide(d3));
System.err.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("0.05 + 0.01 = " + d1.add(d3).doubleValue());
}
}
import java.math.BigDecimal;
/**
* Arith工具类,是对double符点数进行加、减、乘、除基本运算。
* 如果程序中需要对double符点数进行操作,则需要先将double类型数值包装成BigDecimal对象,调用BigDecimal对象
* 的方法执行运算后转换成double类型,这是比较烦琐的过程,则以BigDecimal为基础定义一个Arith工具
* @author liyongyong
*
*/
public class Arith {
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
private Arith(){} //不允许创建对象
public static double add(double v1, double v2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).doubleValue();
}
public static double subtract(double v1, double v2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).doubleValue();
}
public static double multiply(double v1, double v2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).doubleValue();
}
public static double divide(double v1, double v2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("0.05 + 0.01 = " + Arith.add(0.05, 0.01));
System.out.println("1.0 - 0.42 = " + Arith.subtract(1.0, 0.42));
System.out.println("4.015 * 100 = " + Arith.multiply(4.015, 100));
System.out.println("123.3 / 100 = " + Arith.divide(123.3, 100));
}
}