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

  • 相关阅读:
    Ext Js MVC系列二 利用Application和Viewport进行应用程序初始化和页面布局
    LINQ to Sql系列一 增,删,改
    Ext Js MVC系列一 环境搭建和MVC框架整体认识
    LINQ to Sql系列四 性能优化总结
    SQL基础回顾系列一 单表查询(select语句)
    JSON详解
    公用类库(4) 缓存操作类CacheUtil
    架构设计考虑的问题(出自代码大全II)
    .net自动更新组件Ant
    .net socket在win2008下的吞吐性能报告
  • 原文地址:https://www.cnblogs.com/VitoYi/p/7853810.html
Copyright © 2011-2022 走看看