zoukankan      html  css  js  c++  java
  • 使用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)。

  • 相关阅读:
    stl rope
    vijos1574 摇钱树
    图论 Dijkstra+堆优化
    c++输入优化
    Vijos1579 宿命的PSS 最小生成树
    快速求n阶多项式乘积
    c++stl map
    C#函数式程序设计之惰性列表工具——迭代器
    C#函数式程序设计之泛型(下)
    C#函数式程序设计之泛型(上)
  • 原文地址:https://www.cnblogs.com/VitoYi/p/7853810.html
Copyright © 2011-2022 走看看