package com.hanchao.test;
import java.math.BigDecimal;
/***********************
* BigDecimal的简单学习测试
* @author:han
* @version:1.0
* @created:2013-11-11
***********************
*/
public class TestBigDecmal {
/**
一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算。
但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,
他可以完善float和double类无法进行精确计算的缺憾。
*/
/**
* ava.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:
第一种:BigDecimal(double val)
Translates a double into a BigDecimal.
第二种:BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
很多人会问到怎么将基本类型,如int,float,double,long,和BigDecimal对象相互转换。很简单:
基本类型通过构造函数转换成对应的BigDecimal对象,
而BigDecimal类提供了诸如intValue(), floatValue(),
doubleValue(), longValue()方法来将BigDecimal对象转换成对应的值。
*/
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("9.111");
System.out.println(" b1: " + b1); // b1: 9.111
System.out.println(" b1: 变形:" + b1.intValue());// b1: 变形:9
BigDecimal b2 = new BigDecimal(9.111d);
System.out.println(" b2: " + b2); // b2: 9.111000000000000653699316899292171001434326171875
System.out.println(" b2: 变形:" + b2.doubleValue()); // b2: 变形:9.111
BigDecimal b3 = new BigDecimal(9);
System.out.println(" b3: " + b3); // b3: 9
System.out.println(" b3: 变形:" + b3.intValue());// b3: 变形:9
BigDecimal b4 = new BigDecimal(9.111f);
System.out.println(" b4: " + b4);// b4: 9.11100006103515625
System.out.println(" b4: 变形:" + b4.floatValue()); // b4: 变形:9.111
BigDecimal b5 = new BigDecimal(900L);
System.out.println(" b5: " + b5); // b5: 900
System.out.println(" b5: 变形:" + b5.longValue());// b5: 变形:900
/**
* 1.精确加法运算
*/
double r1 = add(1.1, 2.9912);
System.out.println(" r1 : " + r1); // r1 : 4.0912
double r2 = 1.1 + 2.9912;
System.out.println(" r2 : " + r2); // r2 : 4.091200000000001
/**
* 2.精确减法运算
*/
double r3 = sub(2.002, 0.112);
System.out.println(" r3: " + r3); // r3: 1.89
double r4 = 2.002 - 0.112;
System.out.println(" r4: " + r4);// r4: 1.8899999999999997
/**
* 3.精确乘法运算
*/
double r5 = mul(2.002, 1.001);
System.out.println(" r5: " + r5);// r5: 2.004002
double r6 = 2.002 * 1.001;
System.out.println(" r6: " + r6);// r6: 2.0040019999999994
/**
* 4.提供相对精确的除法运算
*/
double r7 = div(3.4, 0.055, 2);
System.out.println(" r7: " + r7); // r7: 61.82
double r8 = 3.4 / 0.055;
System.out.println(" r8: " + r8);// r8: 61.81818181818181
/**
* 5.四舍五入处理
*/
double s1 = round(2.12512,3);
System.out.println(" s1: " + s1);// s1: 2.125
double s2 = round(2.12512, 2);
System.out.println(" s2: " + s2);// s2: 2.13
}
/**
* 提供精确的加法运算
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
double result = b1.add(b2).doubleValue();
return result;
}
/**
* 提供精确的减法运算
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的乘机
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v1 被除数
* @param v2 除数
* @param scale 表示要精确到小数点后几位
* @return 两个参数的商
*/
public static double div(double v1, double v2, int scale) {
if(scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数四舍五入处理
* *******************
* @author: han
* 2013-11-11
* *******************
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale) {
if(scale < 0 ) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
/**
* 比较大小
* 两个BigDecimal值比较使用compareTo方法, 比较结果有-1, 0, 1,
分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示!
*/
BigDecimal num = new BigDecimal("-5");
BigDecimal num1 = new BigDecimal("-4");
if (num.compareTo(BigDecimal.ZERO) == -1) {
System.out.println("num小于0");
} else if (num.compareTo(BigDecimal.ZERO) == 1) {
System.out.println("num大于0");
} else if(num.compareTo(BigDecimal.ZERO) == 0) {
System.out.println("num等于0");
}
转载于:https://blog.51cto.com/hanchaohan/1323228