📜  Java中的 BigDecimal 类

📅  最后修改于: 2022-05-13 01:55:35.923000             🧑  作者: Mango

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.009999999999999998 作为 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 转换为字节,检查丢失的信息。
  6. int compareTo​(BigDecimal val) :此方法将此 BigDecimal 与指定的 BigDecimal 进行比较。
  7. BigDecimal divide​(BigDecimal divisor) :此方法返回一个 BigDecimal,其值为 (this / divisor),其首选比例为 (this.scale() – divisor.scale());如果无法表示确切的商(因为它具有非终止的十进制扩展),则会引发 ArithmeticException。
  8. BigDecimal divide​(BigDecimal divisor, int scale, RoundingMode roundingMode) :此方法返回一个 BigDecimal,其值为 (this / divisor),其比例为指定。
  9. BigDecimal divide​(BigDecimal divisor, MathContext mc) :该方法返回一个 BigDecimal,其值为 (this / divisor),根据上下文设置进行四舍五入。
  10. BigDecimal divide​(BigDecimal divisor, RoundingMode roundingMode) :该方法返回一个 BigDecimal,其值为 (this / divisor),其刻度为 this.scale()。
  11. BigDecimal[] divideAndRemainder​(BigDecimal divisor) :此方法返回一个二元素 BigDecimal 数组,其中包含 divideToIntegralValue 的结果,后跟两个操作数的余数结果。
  12. BigDecimal[] divideAndRemainder​(BigDecimal divisor, MathContext mc) :此方法返回一个二元素 BigDecimal 数组,其中包含 divideToIntegralValue 的结果,后跟根据上下文设置通过舍入计算的两个操作数的余数结果。
  13. BigDecimal divideToIntegralValue​(BigDecimal divisor) :此方法返回一个 BigDecimal,其值为四舍五入的商(this / divisor)的整数部分。
  14. BigDecimal divideToIntegralValue​(BigDecimal divisor, MathContext mc) :此方法返回一个 BigDecimal,其值为 (this / divisor) 的整数部分。
  15. double doubleValue​() :此方法将此 BigDecimal 转换为双精度值。
  16. boolean equals​(Object x) :此方法将此 BigDecimal 与指定的 Object 进行比较是否相等。
  17. float floatValue​() :此方法将此 BigDecimal 转换为浮点数。
  18. int hashCode​() :此方法返回此 BigDecimal 的哈希码。
  19. int intValue​() :此方法将此 BigDecimal 转换为 int。
  20. int intValueExact​() :此方法将此 BigDecimal 转换为 int,检查丢失的信息。
  21. long longValue​() :此方法将此 BigDecimal 转换为 long。
  22. long longValueExact​() :此方法将此 BigDecimal 转换为 long,检查丢失的信息。
  23. BigDecimal max​(BigDecimal val) :此方法返回此 BigDecimal 和 val 的最大值。
  24. BigDecimal min​(BigDecimal val) :此方法返回此 BigDecimal 和 val 的最小值。
  25. BigDecimal movePointLeft​(int n) :此方法返回一个 BigDecimal,它等效于将小数点向左移动 n 位的这个。
  26. BigDecimal movePointRight​(int n) :此方法返回一个 BigDecimal,它相当于将小数点向右移动 n 位的 BigDecimal。
  27. BigDecimal multiply​(BigDecimal multiplicand) :此方法返回一个 BigDecimal,其值为 (this × multiplicand),其比例为 (this.scale() + multiplicand.scale())。
  28. BigDecimal multiply​(BigDecimal multiplicand, MathContext mc) :此方法返回一个 BigDecimal,其值为 (this × multiplicand),根据上下文设置进行舍入。
  29. BigDecimal negate​() :此方法返回一个 BigDecimal,其值为 (-this),其刻度为 this.scale()。
  30. BigDecimal negate​(MathContext mc) :此方法返回一个 BigDecimal,其值为 (-this),根据上下文设置进行舍入。
  31. BigDecimal plus​() :此方法返回一个 BigDecimal,其值为 (+this),其刻度为 this.scale()。
  32. BigDecimal plus​(MathContext mc) :此方法返回一个值为 (+this) 的 BigDecimal,根据上下文设置进行四舍五入。
  33. BigDecimal pow​(int n) :此方法返回一个 BigDecimal,其值为 (thisn),幂计算精确,精度不受限制。
  34. BigDecimal pow​(int n, MathContext mc) :此方法返回一个 BigDecimal,其值为 (thisn)。
  35. int precision​() :此方法返回此 BigDecimal 的精度。
  36. BigDecimal 余数​(BigDecimal divisor) :此方法返回一个 BigDecimal,其值为 (this % divisor)。
  37. BigDecimal 余数​(BigDecimal divisor, MathContext mc) :此方法返回一个 BigDecimal,其值为 (this % divisor),根据上下文设置进行四舍五入。
  38. BigDecimal round​(MathContext mc) :此方法返回根据 MathContext 设置四舍五入的 BigDecimal。
  39. int scale​() :此方法返回此 BigDecimal 的比例。
  40. BigDecimal scaleByPowerOfTen​(int n) :此方法返回一个 BigDecimal,其数值等于 (this * 10n)。
  41. BigDecimal setScale​(int newScale) :此方法返回一个 BigDecimal,其比例为指定值,其值在数值上等于此 BigDecimal 的值。
  42. BigDecimal setScale​(int newScale, RoundingMode roundingMode) :此方法返回一个 BigDecimal,其刻度为指定值,其未缩放值通过将此 BigDecimal 的未缩放值乘以或除以适当的 10 次方来确定,以保持其整体值。
  43. short shortValueExact​() :此方法将此 BigDecimal 转换为 short,检查丢失的信息。
  44. int signum​() :此方法返回此 BigDecimal 的符号函数。
  45. BigDecimal sqrt​(MathContext mc) :此方法返回平方根的近似值,并根据上下文设置进行舍入。
  46. BigDecimal stripTrailingZeros​() :此方法返回一个 BigDecimal,它在数值上等于这个值,但从表示中删除了任何尾随零。
  47. BigDecimal subtrahend​(BigDecimal subtrahend) :此方法返回一个 BigDecimal,其值为 (this – subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
  48. BigDecimal subtrahend​(BigDecimal subtrahend, MathContext mc) :此方法返回一个 BigDecimal,其值为 (this – subtrahend),根据上下文设置进行舍入。
  49. BigInteger toBigInteger​() :此方法将此 BigDecimal 转换为 BigInteger。
  50. BigInteger toBigIntegerExact​() :此方法将此 BigDecimal 转换为 BigInteger,检查丢失的信息。
  51. String toEngineeringString​() :此方法返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用工程符号。
  52. String toPlainString​() :此方法返回此 BigDecimal 的字符串表示形式,不带指数字段。
  53. String toString​() :此方法返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学计数法。
  54. BigDecimal ulp​() :此方法返回此 BigDecimal 的最后一个单位的 ulp 的大小。
  55. BigInteger unscaledValue​() :此方法返回一个 BigInteger,其值是此 BigDecimal 的未缩放值。
  56. static BigDecimal valueOf​(double val) :此方法使用 Double.toString(double) 方法提供的 double 的规范字符串表示形式将 double 转换为 BigDecimal。
  57. static BigDecimal valueOf​(long val) :此方法将 long 值转换为比例为零的 BigDecimal。
  58. static BigDecimal valueOf​(long unscaledVal, int scale) :此方法将 long unscaled 值和 int scale 转换为 BigDecimal。

有关更多示例,请访问Java BigDecimal 示例

相关文章:

  • 在Java中使用 BigDecimal 计算最多 200 个十进制数字的 PI 数
  • 用 BigDecimal 赚取美分

    有关更多功能和详细信息,请参阅Class BigDecimal