使用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)。

原文地址:https://www.cnblogs.com/VitoYi/p/7853810.html