当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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


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


相关用法


注:本文由纯净天空筛选整理自MadhuramJajoo大神的英文原创作品 BigDecimal Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。