• BigDecimal使用整理


    BigDecimal使用整理

    一、     BigDecimal简介

    计算机计算中无论是float还是double都是浮点数,由于计算机是二进制的,导致在在浮点数计算时会出现精度丢失,因此引入BigDecimaljava.math.BigDecimal)。

    Javajava.math包中提供的 APIBigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。floatdouble只能用来做科学计算或者是工程计算,在商业计算中要用 java.math.BigDecimal(BigDecimal)所创建的是对象,我们不能使用传统的+-*/等算术运算符直接对其对象进行数学运算,而必须调用BigDecimal相对应的方法。方法中的参数也必须是BigDecimal的对象。

     

    二、     BigDecimal构造方法

    Bigdecimal构造时,不要直接使浮点数作为构造方法的参数,这样会出现精度丢失的问题。

          Bigdecimal构造时使用BigDecimal.valueOf()方法,或者使用字符串作为BigDecimal构造方法的参数,避免精度丢失的问题。

    例如:

      BigDecimal b1 = new BigDecimal("1.23");//1.23

      BigDecimal b2 = BigDecimal.valueOf(1.23);//1.23

      BigDecimal b3 = new BigDecimal(String.valueof(1.23));//1.23

    精度丢失例如:

    BigDecimal one1 = new BigDecimal(1.23); // 则结果会出现精度问题, 相应值会变成1.229999999999999982236431605997495353221893310546875
     

    另外除了这两种外,特殊的像0110可以这样写。

    1.  BigDecimal zero = BigDecimal.ZERO;

    2.  BigDecimal one  = BigDecimal.ONE;

    3.  BigDecimal ten  = BigDecimal.TEN;

     

    三、      BigDecimal的加减乘除运算
      public BigDecimal add(BigDecimal value); // 加法
      public BigDecimal subtract(BigDecimal value); // 减法 
      public BigDecimal multiply(BigDecimal value); // 乘法
      public BigDecimal divide(BigDecimal value); // 除法
     
    BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象。
     
    四、      BigDecimal的比较方法(compareToequals对比)

    BigDecimal在数字上小于等于或大于被比较对象时,返回 -10 1

    例如:

    BigDecimal one = BigDecimal.valueOf(1);

    BigDecimal two = new BigDecimal("2");

    BigDecimal three = one.add(two);

    int i1 = one.compareTo(two);     // -1

    int i2 = two.compareTo(two);     // 0

    int i3 = three.compareTo(two);   // 1

    注意值相等但具有不同精度的两个BigDecimal对象(如,1.0 1.00)被认为是相等的。

    注意BigDecimal的比较运算最好不要用equals实现,因为BigDecimalequals方法在比较的时候要比较两个数值的精度。

       // 精度不同,数值不相等

    BigDecimal decimal1 = BigDecimal.valueOf(0);

    BigDecimal decimal2 = new BigDecimal("0.00");

    System.out.println("the result is " +decimal1.equals(decimal2)); // false

     

        // 设置为相同精度后再次比较

    BigDecimal decimal3 = BigDecimal.valueOf(0).setScale(2);

    BigDecimal decimal4 = new BigDecimal("0.00").setScale(2);

    System.out.println("the result is " +decimal3.equals(decimal4)); // true

     

    使用BigDecimalequals方法判断两个BigDecimal类型的数据时,需要设置精度,否则结果可能不正确

     

     
     
  • 相关阅读:
    SG函数
    贪心:zoj3953 Intervals
    山东省第四届省赛 E-Mountain Subsequences
    山东省第四届ACM程序设计竞赛A题:Rescue The Princess
    前缀和:CodeForces 932B Recursive Queries
    常用头文件和一些简单的函数
    codeforce 429D. Tricky Function (思维暴力过)
    HDU-5754 Life Winner Bo (博弈论)
    线程池的原理与实现
    运行停止一个线程
  • 原文地址:https://www.cnblogs.com/widget90/p/9504012.html
Copyright © 2020-2023  润新知