Java中的BigDecimal类

BigDecimal类提供对双精度数字的运算,用于算术、刻度处理、舍入、比较、格式转换和散列。它可以处理非常大和非常小的浮点数,精度很高,但时间复杂度有所补偿。 BigDecimal由一个随机精度整数无标度值和一个32位整数标度组成。如果大于或等于零,则刻度为小数点右侧的位数。如果小于零,则数字的未标度值乘以10^(-scale)。

null

例如:

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

需要大十进制

  • 两种java原语类型(double和float)都是浮点数,它们存储为分数和指数的二进制表示形式。
  • 其他基本类型(布尔型除外)是定点数。与定点数字不同,浮点数在大多数情况下会返回一个带有小错误的答案(大约10^-19)。这就是为什么在上面的示例中,我们最终得到0.009999999998,结果是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. 大十进制abs​() :此方法返回一个BigDecimal,其值为该BigDecimal的绝对值,其刻度为。缩放()。
  2. 大十进制abs​(马修) :此方法返回一个BigDecimal,其值为该BigDecimal的绝对值,并根据上下文设置进行舍入。
  3. 大十进制加法​(完) :此方法返回一个BigDecimal,其值为(This+augend),其刻度为max(This.scale(),augend)。scale())。
  4. 大十进制加法​(BigDecimal augend,MathContext mc) :此方法返回一个BigDecimal,其值为(This+augend),并根据上下文设置进行舍入。
  5. 字节字节值精确​() :此方法将此BigDecimal转换为字节,以检查丢失的信息。
  6. 比较​(BigDecimal val) :此方法将此BigDecimal与指定的BigDecimal进行比较。
  7. 大十进制除法​(大十进制除数) :此方法返回一个BigDecimal,其值为(This/divisior),首选的小数位数为(This.scale()–divisior)。比例();如果无法表示精确的商(因为它有一个非终止的十进制扩展),将引发算术异常。
  8. 大十进制除法​(大十进制除数、整数刻度、舍入模式舍入模式) :此方法返回一个BigDecimal,其值为(This/除数),其小数位数为指定值。
  9. 大十进制除法​(大十进制除数,MathContext mc) :此方法返回一个BigDecimal,其值为(This/除数),并根据上下文设置进行舍入。
  10. 大十进制除法​(大十进制除数,舍入模式舍入模式) :此方法返回一个BigDecimal,其值为(This/除数),其小数位数为。缩放()。
  11. BigDecimal[]除法和除法器​(大十进制除数) :此方法返回一个两元素的BigDecimal数组,该数组包含divideToIntegralValue的结果,后跟两个操作数的余数结果。
  12. BigDecimal[]除法和除法器​(大十进制除数,MathContext mc) :此方法返回一个两元素的BigDecimal数组,其中包含divideToIntegralValue的结果,后跟根据上下文设置通过舍入计算的两个操作数的余数结果。
  13. 大十进制除法积分值​(大十进制除数) :此方法返回一个BigDecimal,其值是向下舍入的商(此/除数)的整数部分。
  14. 大十进制除法积分值​(大十进制除数,MathContext mc) :此方法返回一个BigDecimal,其值是(This/除数)的整数部分。
  15. 双倍值​() :此方法将此BigDecimal转换为double。
  16. 布尔等于​(对象x) :此方法将此BigDecimal与指定的对象进行相等比较。
  17. 浮动值​() :此方法将此BigDecimal转换为浮点。
  18. int哈希代码​() :此方法返回此BigDecimal的哈希代码。
  19. int值​() :此方法将此BigDecimal转换为int。
  20. int intValueExact​() :此方法将此BigDecimal转换为int,以检查丢失的信息。
  21. 长期价值​() :此方法将此BigDecimal转换为long。
  22. 长时间精确​() :此方法将此BigDecimal转换为long,以检查丢失的信息。
  23. 最大十进制数​(BigDecimal val) :此方法返回此BigDecimal和val的最大值。
  24. 大十进制最小值​(BigDecimal val) :此方法返回此BigDecimal和val的最小值。
  25. 大小数点左移​(int n) :此方法返回一个BigDecimal,它相当于将小数点向左移动n位的BigDecimal。
  26. 大小数点对吗​(int n) :此方法返回一个BigDecimal,它相当于将小数点向右移动n位的BigDecimal。
  27. 大十进制乘法​(大十进制被乘数) :此方法返回一个BigDecimal,其值为(This×被乘数),其小数位数为(This.scale()+被乘数)。scale())。
  28. 大十进制乘法​(BigDecimal被乘数,MathContext mc) :此方法返回一个BigDecimal,其值为(This×被乘数),并根据上下文设置进行舍入。
  29. 大十进制否定​() :此方法返回一个BigDecimal,其值为(-This),其小数位数为This。缩放()。
  30. 大十进制否定​(马修) :此方法返回一个BigDecimal,其值为(-This),并根据上下文设置进行舍入。
  31. 大十进制加号​() :此方法返回一个BigDecimal,其值为(+This),其小数位数为This。缩放()。
  32. 大十进制加号​(马修) :此方法返回值为(+This)的BigDecimal,并根据上下文设置进行舍入。
  33. 大十进制功率​(int n) :此方法返回一个BigDecimal,其值为(thisn),幂的计算精度不受限制。
  34. 大十进制功率​(int n,MathContext mc) :此方法返回一个值为(thisn)的BigDecimal。
  35. 整数精度​() :此方法返回此BigDecimal的精度。
  36. 大十进制余数​(大十进制除数) :此方法返回一个BigDecimal,其值为(此%除数)。
  37. 大十进制余数​(大十进制除数,MathContext mc) :此方法返回一个BigDecimal,其值为(此%除数),并根据上下文设置进行舍入。
  38. 大十进制四舍五入​(马修) :此方法返回根据MathContext设置取整的BigDecimal。
  39. 整数刻度​() :此方法返回此BigDecimal的小数位数。
  40. BigDecimal scaleByPowerOfTen​(int n) :此方法返回一个BigDecimal,其数值等于(此*10n)。
  41. 大十进制设置刻度​(国际新闻级) :此方法返回一个BigDecimal,其刻度为指定值,其值在数字上等于此BigDecimal。
  42. 大十进制设置刻度​(int newScale,RoundingMode RoundingMode) :此方法返回一个BigDecimal,其刻度为指定值,其未刻度值是通过将该BigDecimal的未刻度值乘以或除以适当的十次幂来确定的,以保持其整体值。
  43. 短值精确​() :此方法将此BigDecimal转换为short,以检查丢失的信息。
  44. 内部信号​() :此方法返回此BigDecimal的signum函数。
  45. 大十进制sqrt​(马修) :此方法根据上下文设置,通过四舍五入,返回该值的平方根近似值。
  46. 大十进制带零​() :此方法返回一个BigDecimal,该值在数值上等于此值,但从表示中删除了任何尾随零。
  47. 大十进制减法​(大十进制减数) :此方法返回一个BigDecimal,其值为(This–subtrahand),其刻度为max(This.scale(),subtrahand)。scale())。
  48. 大十进制减法​(BigDecimal subtrahand,MathContext mc) :此方法返回一个BigDecimal,其值为(This–subtrahand),并根据上下文设置进行舍入。
  49. BigInteger Tobiginger​() :此方法将此BigDecimal转换为BigInteger。
  50. BigInteger ToBiginteRexact​() :此方法将此BigDecimal转换为BigInteger,以检查丢失的信息。
  51. 字符串到工程字符串​() :此方法返回此BigDecimal的字符串表示形式,如果需要指数,则使用工程符号。
  52. 弦顶弹​() :此方法返回此BigDecimal的字符串表示形式,不带指数字段。
  53. 串到串​() :此方法返回此BigDecimal的字符串表示形式,如果需要指数,则使用科学记数法。
  54. 大十进制ulp​() :此方法返回此BigDecimal的ulp大小,即最后一位的单位。
  55. 大整数非标度值​() :此方法返回一个BigInteger,其值是此BigDecimal的未标度值。
  56. 静态BigDecimal值​(双倍增值) :此方法使用double提供的double的规范字符串表示形式将double转换为BigDecimal。toString(双重)方法。
  57. 静态BigDecimal值​(朗瓦尔) :此方法将长值转换为小数位数为零的BigDecimal。
  58. 静态BigDecimal值​(长未标度,整数标度) :此方法将长的无标度值和整数标度转换为BigDecimal。

有关更多示例,请访问 Java BigDecimal示例 相关文章:

  • 在Java中使用BigDecimal计算多达200位小数的PI数
  • 用BigDecimal赚钱

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

  • © 版权声明
    THE END
    喜欢就支持一下吧
    点赞10 分享