Java BigDecimal类

Java BigDecimal类

BigDecimal类提供了对双数的运算、比例处理、四舍五入、比较、格式转换和散列的操作。它可以非常精确地处理非常大和非常小的浮点数,但在时间复杂度上有一点补偿。

一个BigDecimal由一个随机精度的未标定的整数值和一个32位的整数刻度组成。如果大于或等于零,刻度就是小数点右边的数字。如果小于零,则该数字的未标度值要乘以10^(-scale)。

例子。

Input : double a=0.03;
        double b=0.04;
        double c=b-a;
        System.out.println(c);
Output :0.009999999999999998

Input : BigDecimal _a = new BigDecimal("0.03");
        BigDecimal _b = new BigDecimal("0.04");
        BigDecimal _c = _b.subtract(_a);
        System.out.println(_c);
Output :0.01

BigDecimal的需求

  • java的两种原始类型(double和float)是浮点数,它被存储为分数和指数的二进制表示。
  • 其他原始类型(除了布尔型)都是定点数字。与定点数不同的是,浮点数在大多数情况下都会返回一个有小误差的答案(大约10^-19),这就是为什么在上面的例子中,我们最终以0.00999999999998作为0.04-0.03的结果。

但是BigDecimal却为我们提供了准确的答案。

// Java Program to illustrate BigDecimal Class
  
import java.math.BigDecimal;
public class BigDecimalExample
{
    public static void main(String[] args) 
    {
        // Create two new BigDecimals
        BigDecimal bd1 = 
               new BigDecimal("124567890.0987654321");
        BigDecimal bd2 = 
               new BigDecimal("987654321.123456789");
          
        // Addition of two BigDecimals
        bd1 = bd1.add(bd2);
        System.out.println("BigDecimal1 = " + bd1);
  
        // Multiplication of two BigDecimals
        bd1 = bd1.multiply(bd2);
        System.out.println("BigDecimal1 = " + bd1);
  
        // Subtraction of two BigDecimals
        bd1 = bd1.subtract(bd2);
        System.out.println("BigDecimal1 = " + bd1);
  
        // Division of two BigDecimals
        bd1 = bd1.divide(bd2);
        System.out.println("BigDecimal1 = " + bd1);
  
        // BigDecima1 raised to the power of 2
        bd1 = bd1.pow(2);
        System.out.println("BigDecimal1 = " + bd1);
  
        // Negate value of BigDecimal1
        bd1 = bd1.negate();
        System.out.println("BigDecimal1 = " + bd1);
    }    
}        

输出:-

BigDecimal1 = 1112222211.2222222211
BigDecimal1 = 1098491072963113850.7436076939614540479
BigDecimal1 = 1098491071975459529.6201509049614540479
BigDecimal1 = 1112222210.2222222211
BigDecimal1 = 1237038244911605079.77528397755061728521
BigDecimal1 = -1237038244911605079.77528397755061728521

声明

double a, b;                
BigDecimal A, B; 

初始化

a = 5.4;
b = 2.3;
A  = BigDecimal.valueOf(5.4);
B  = BigDecimal.valueOf(2.3); 

如果给你一个双数的字符串表示,那么你可以用以下方式初始化。

A  = new BigDecimal(“5.4”);
B  = new BigDecimal(“1238126387123.1234”); 

为了便于初始化,BigDecimal类有一些预定义的常量。

A = BigDecimal.ONE;
// Other than this, available constants
// are BigDecimal.ZERO and BigDecimal.TEN 

数学运算

int c = a + b;
BigDecimal C = A.add(B); 
Other similar function are subtract() , multiply(), divide(), pow()

但是所有这些函数,除了pow()以整数为参数外,都以BigDecimal为参数,所以如果我们想对小数或字符串进行这些操作,在将它们传递给函数之前,先将它们转换成BigDecimal,如下图所示。

String str = “123456789.123456789”;
BigDecimal C = A.add(new BigBigDecimal(str));
double val  = 123456789.123456789;
BigDecimal C = A.add(BigDecimal.valueOf(val)); 

从BigDecimal中提取数值

// value should be in limit of double x
double x   =  A.doubleValue();   

// To get string representation of BigDecimal A
String z = A.toString();       

比较

if (a < b) {}         // For primitive double
if (A.compareTo(B) < 0)  {} // For BigDecimal

实际上compareTo根据数值返回-1(小于),0(相等),1(大于)。

对于平等,我们也可以使用。

if (A.equals(B)) {}  // A is equal to B 

BigDecimal类的方法。

  1. BigDecimal abs() : 该方法返回一个BigDecimal,其值是这个BigDecimal的绝对值,其比例是this.scale()。
  2. BigDecimal abs(MathContext mc) 。该方法返回一个BigDecimal,其值是这个BigDecimal的绝对值,并根据上下文设置进行舍入。
  3. BigDecimal add(BigDecimal augend) 。该方法返回一个BigDecimal,其值为(this + augend),其比例为max(this.scale(), augend.scale())。
  4. BigDecimal add(BigDecimal augend, MathContext mc) : 该方法返回一个BigDecimal,其值为(this + augend),并根据上下文设置进行四舍五入。
    5.byte byteValueExact() 。该方法将BigDecimal转换为一个字节,并检查是否有丢失的信息。
  5. int compareTo(BigDecimal val) 。该方法将这个BigDecimal与指定的BigDecimal进行比较。
  6. BigDecimal divide(BigDecimal divisor) 。该方法返回一个BigDecimal,其值为(this / divisor),其首选比例为(this.scale() – divisor.scale());如果不能表示精确的商(因为它有一个非终止的小数扩展),将抛出ArithmeticException。
  7. BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) : 该方法返回一个BigDecimal,其值为(this / divisor),其比例为指定值。
  8. BigDecimal divide(BigDecimal divisor, MathContext mc) 。该方法返回一个BigDecimal,其值为(this / divisor),并根据上下文设置进行舍入。
  9. BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) 。本方法返回一个BigDecimal,其值为(this / divisor),其比例为this.scale()。
  10. BigDecimal[] divideAndRemainder(BigDecimal divisor) : 该方法返回一个两元素的BigDecimal数组,其中包含除以整数的结果,以及两个操作数的余数结果。
  11. BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) 。该方法返回一个两元素的BigDecimal数组,其中包含除以积分的结果和两个操作数的余数,余数是根据上下文设置进行四舍五入计算的。
  12. BigDecimal divideToIntegralValue(BigDecimal divisor) 。该方法返回一个BigDecimal,其值为商的整数部分(本数/除数),并向下舍入。
  13. BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) 。该方法返回一个BigDecimal,其值是(this / divisor)的整数部分。
    double doubleValue() 。该方法将BigDecimal转换为双数。
  14. boolean equals(Object x) 。该方法将BigDecimal与指定的Object进行比较,以确定是否相等。
    float floatValue() : 这个方法将BigDecimal转换为双数。该方法将BigDecimal转换为浮点数。
  15. int hashCode() 。该方法返回BigDecimal的哈希代码。
    intValue() 。该方法将BigDecimal转换为int。
    intValueExact() 。该方法将BigDecimal转换为int,并检查是否有丢失的信息。
    longValue()。此方法将BigDecimal转换为long。
    longValueExact() 。此方法将BigDecimal转换为long,并检查是否有丢失信息。
  16. BigDecimal max(BigDecimal val) : 该方法返回这个BigDecimal和val的最大值。
  17. BigDecimal min(BigDecimal val) 。此方法返回此BigDecimal和val的最小值。
  18. BigDecimal movePointLeft(int n) 。该方法返回一个小数点向左移动了n位的BigDecimal,与该BigDecimal等价。
  19. BigDecimal movePointRight(int n) : 该方法返回一个小数点向右移动了n位的BigDecimal,与该方法等价。
  20. BigDecimal multiply(BigDecimal multiplicand) : 该方法返回一个BigDecimal,其值为(this × multiplicand),其比例为(this.scale() + multiplicand.scale())。
  21. BigDecimal multiply(BigDecimal multiplicand, MathContext mc) 。该方法返回一个BigDecimal,其值为(this × multiplicand),并根据上下文设置进行四舍五入。
  22. BigDecimal negate() 。该方法返回一个BigDecimal,其值为(-this),其比例为this.scale()。
  23. BigDecimal negate(MathContext mc) : 该方法返回一个BigDecimal,其值为(-this),并根据上下文的设置进行四舍五入。
  24. BigDecimal plus() : 该方法返回一个BigDecimal,其值为(+this),其比例为this.scale()。
  25. BigDecimal plus(MathContext mc) : 该方法返回一个BigDecimal,其值为(+this),并根据上下文设置进行舍入。
  26. BigDecimal pow(int n) : 该方法返回一个BigDecimal,其值为(thisn),功率的计算是精确的,不受精度限制。
  27. BigDecimal pow(int n, MathContext mc) : 该方法返回一个BigDecimal,其值为(thisn)。
  28. int precision() 。该方法返回该BigDecimal的精度。
  29. BigDecimal remainder(BigDecimal divisor) 。该方法返回一个BigDecimal,其值为(this % divisor)。
  30. BigDecimal remainder(BigDecimal divisor, MathContext mc) 。该方法返回一个BigDecimal,其值为(this % divisor),并根据上下文设置进行四舍五入。
  31. BigDecimal round(MathContext mc) 。该方法返回一个根据MathContext设置四舍五入的BigDecimal。
  32. int scale() 。该方法返回该BigDecimal的比例。
  33. BigDecimal scaleByPowerOfTen(int n) 。该方法返回一个BigDecimal,其数值等于(this * 10n)。
  34. BigDecimal setScale(int newScale) : 该方法返回一个BigDecimal,该BigDecimal的刻度是指定的值,并且其数值等于这个BigDecimal的数值。
  35. BigDecimal setScale(int newScale, RoundingMode roundingMode) : 该方法返回一个BigDecimal,其刻度是指定的值,其非刻度值是通过将这个BigDecimal的非刻度值乘以或除以适当的10次方,以保持其整体值。
  36. short shortValueExact() 。该方法将这个BigDecimal转换为short,检查是否有丢失的信息。
  37. int signum() 。该方法返回这个BigDecimal的符号函数。
  38. BigDecimal sqrt(MathContext mc) : 本方法根据上下文的设置,返回一个近似的平方根值。
  39. BigDecimal stripTrailingZeros() 。该方法返回一个BigDecimal,该BigDecimal在数字上等于这个BigDecimal,但是在表示上去掉了任何尾部的零。
  40. BigDecimal subtract(BigDecimal subtrahend) : 该方法返回一个BigDecimal,其值为(this – subtrahend),其比例为max(this.scale(), subtrahend.scale())。
  41. BigDecimal subtract(BigDecimal subtrahend, MathContext mc) 。该方法返回一个BigDecimal,其值为(this – subtrahend),并根据上下文设置进行舍入。
  42. BigInteger toBigInteger() 。该方法将BigDecimal转换为BigInteger。
  43. BigInteger toBigIntegerExact() : 该方法将BigDecimal转换为BigInteger,并检查是否有丢失的信息。
  44. String toEngineeringString() 。该方法返回该BigDecimal的字符串表示,如果需要指数,则使用工程记数法。
  45. String toPlainString() : 该方法返回该BigDecimal的字符串表示,不含指数域。
  46. String toString() : 该方法返回该BigDecimal的字符串表示,如果需要指数,则使用科学计数法。
  47. BigDecimal ulp() : 该方法返回这个BigDecimal的一个ulp的大小,即最后一位的单位。
  48. BigInteger unscaledValue() : 该方法返回一个BigInteger,其值为该BigDecimal的未缩放值。
  49. static BigDecimal valueOf(double val) 。该方法使用Double.toString(double)方法提供的双倍数的典型字符串表示法,将双倍数转换为大十进制。
  50. static BigDecimal valueOf(long val) 。该方法将一个长的数值转化为比例为0的BigDecimal。
    58.静态BigDecimal valueOf(long unscaledVal, int scale) 。该方法将一个未标定的长数值和一个int scale翻译成BigDecimal。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程