使用BigDecimal进行运算
一、MySQL中的decimal类型
在MySQL数据库中,有个decimal类型。
`product_price` decimal(8,2) NOT NULL COMMENT '单价',
decimal(8,2)
其中,8表示有效位数,也就是整数+小数一共不超过8位,2表示保留2个小数位。decimal(8,2)
就表示数值中共有8位,其中6位整数,2位小数。
例:decimal(2,1)
,此时,插入数据“12.3”、“12”等会出现“数据溢出错误”的异常;插入“1.23”或“1.2345...”会自动四舍五入成“1.2”;插入“2”会自动补成“2.0”,以确保2位的有效长度,其中包含1位小数。
数据库中的decimal
类型,在Java中使用BigDecimal
接收。
本次,就主要来说说Java中的BigDecimal
。
二、Java中的BigDecimal类型
1、介绍
引用http://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html的例子:
public class Test {
public static void main(String[] args) {
System.out.println(0.06 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(303.1 / 1000);
}
}
输出结果:
0.06999999999999999
0.5800000000000001
401.49999999999994
0.30310000000000004
你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。
其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
记得以前老师也说过,凡是涉及到金额、精确计算的,数据库中都使用decimal类型,对应的Java当中就是BigDecimal类型。
2、构造方法
BigDecimal有几个常用的构造方法
BigDecimal bignum1 = new BigDecimal("3.4");
BigDecimal bignum2 = new BigDecimal(3);
BigDecimal bignum3 = null;
3、BigDecimal的加减乘除
//加法
bignum3 = bignum1.add(bignum2);
System.out.println("和 是:" + bignum3);
//减法
bignum3 = bignum1.subtract(bignum2);
System.out.println("差 是:" + bignum3);
//乘法
bignum3 = bignum1.multiply(bignum2);
System.out.println("积 是:" + bignum3);
//除法
bignum3 = bignum1.divide(bignum2, 3); //精确到三位小数
System.out.println("商 是:" + bignum3);
除法是有两个参数,否则可能会报错:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal res
当不整除,出现无限循环小数时,就会抛异常。
因此,第二个参数就是设置精确的小数点,如:divide(xxxxx,2)。