赞
踩
一、认识
float和double两种数据类型容易引起精度的丢失,所以java提供BigDecimal类提高精度。该类提供了大量的构造器用于 创建BigDecimal 对象,把所有的基本数值类型变量转换成一个BigDecimal对象。
二、常用的两个构造器:
1、BigDecimal(double value):不推荐使用该构造器,因为当使用new BigDecimal(0.1)来创建一个对象时,它的值不是0.1,而实际上是一个近似0.1的值,表面看着是个0.1。
2、BidDiecimal(String value):推荐使用这个构造器,newBigDecimal("0.1")来创建一个对象时,得到的和预期的一样是个0.1的值。
注意如果非要接收一个double的值得话,可以通过BigDecimal.valueOf(double value)静态方法来创建对象。例如:
BigDecimal f2 = BigDecimal.valueOf(0.01);
三、基本操作
add(BigDecimal value):精确加法
subtract(BigDecimal value):精确减法
multiply(BigDecimal value):精确乘法
divide(BigDecimal value);精确除法
四、java实现
import java.math.BigDecimal; public class BigDecimalTest { public static void main(String[] args){ BigDecimal f1 = new BigDecimal("0.05"); BigDecimal f2 = BigDecimal.valueOf(0.01); BigDecimal f3 = new BigDecimal(0.05); System.out.println(f1); System.out.println("使用String作为BigDecimal构造器参数"); System.out.println(f2); System.out.println("0.05 + 0.01 = " + f1.add(f2)); System.out.println("0.05 - 0.01=" + f1.subtract(f2)); System.out.println("0.05 * 0.01=" + f1.multiply(f2)); System.out.println("0.05 / 0.01=" + f1.divide(f2)); System.out.println("使用double作为BigDecimal构造器参数:"); System.out.println("0.05 + 0.01 =" + f3.add(f2)); System.out.println("0.05 - 0.01 =" + f3.subtract(f2)); System.out.println("0.05 * 0.01 =" + f3.multiply(f2)); System.out.println("0.05 / 0.01 =" + f3.divide(f2)); } }
结果:
五、Arith工具类
过程:先将double数值包装成BigDecimal类型,运算出结果后,再转成double类型。
java实现:
import java.math.BigDecimal; 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 sub(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.subtract(b2).doubleValue(); } //提供精确的乘法运算 public static double mul(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.multiply(b2).doubleValue(); } //提供精确的除法运算 public static double div(double v1,double v2){ BigDecimal b1 = BigDecimal.valueOf(v1); BigDecimal b2 = BigDecimal.valueOf(v2); return b1.divide(b2).doubleValue(); } }
//ArithMain类
- public class ArithMain {
- public static void main(String[] args){
- System.out.println("0.06 + 0.02 = " + Arith.add(0.06,0.02));
- System.out.println("0.06 - 0.02 = " + Arith.sub(0.06,0.02));
- System.out.println("0.06 * 0.02 = " + Arith.mul(0.06,0.02));
- System.out.println("-123.3 / 100 = " + Arith.div(-123.3,100));
-
- }
- }
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。