JavaDemo——关于BigDecimal类

x33g5p2x  于2022-08-17 转载在 Java  
字(7.1k)|赞(0)|评价(0)|浏览(519)

BigDecimal通常用于精确的商业计算,处理较大数据的运算,BigDecimal不用使用简单的+-*/等,需要用类自己的方法运算,普通float和double保存的时候就会有误差更不用说运算了(计算机使用的二进制不能完全精准的表示十进制);

BigDecimalDemo:

  1. /**
  2. * 2022年7月28日上午9:59:00
  3. */
  4. package testBigDecimal;
  5. import java.math.BigDecimal;
  6. import java.math.BigInteger;
  7. import java.math.MathContext;
  8. import java.math.RoundingMode;
  9. import java.util.Arrays;
  10. /**
  11. * @author XWF
  12. *
  13. */
  14. public class TestBigDecimal {
  15. /**
  16. * @param args
  17. */
  18. public static void main(String[] args) {
  19. test1();
  20. test2();
  21. }
  22. public static void test1() {
  23. System.out.println("========== test1 ==========");
  24. System.out.println("BigInteger : " + new BigDecimal(BigInteger.TWO));
  25. System.out.println("char[] : " + new BigDecimal(new char[] {'1', '2', '.', '3', '4'}));
  26. System.out.println("double : " + new BigDecimal(1.2345d));//double类型精度有问题
  27. System.out.println("int : " + new BigDecimal(123));
  28. System.out.println("long : " + new BigDecimal(1234567890123456789L));
  29. System.out.println("string : " + new BigDecimal("1.2345"));//优先使用string
  30. System.out.println("BigInteger scale : " + new BigDecimal(BigInteger.valueOf(123456), 3));//unscaledVal x 10^(-scale)
  31. System.out.println("BigInteger scale : " + new BigDecimal(BigInteger.valueOf(123456), -2));
  32. System.out.println("char[] offset len : " + new BigDecimal(new char[] {'1', '2', '.', '3', '4'}, 1, 3));
  33. MathContext mc = new MathContext(3);//保留3位有效数字
  34. System.out.println("MathContext BigInteger : " + new BigDecimal(BigInteger.valueOf(54321), mc));
  35. System.out.println("MathContext char[] : " + new BigDecimal(new char[] {'1', '2', '.', '3', '4'}, mc));
  36. System.out.println("MathContext double : " + new BigDecimal(1.2345d, mc));
  37. System.out.println("MathContext int : " + new BigDecimal(123, mc));
  38. System.out.println("MathContext long : " + new BigDecimal(1234567890123456789L, mc));
  39. System.out.println("MathContext string : " + new BigDecimal("12345", mc));
  40. System.out.println("MathContext BigInteger scale : " + new BigDecimal(BigInteger.valueOf(123456), 3, mc));
  41. System.out.println("MathContext char[] offset len : " + new BigDecimal(new char[] {'1', '2', '.', '3', '4'}, 1, 3, mc));
  42. }
  43. public static void test2() {
  44. System.out.println("========== test2 ==========");
  45. BigDecimal bd1 = new BigDecimal("-9");
  46. BigDecimal bd2 = new BigDecimal("4");
  47. BigDecimal bd3 = new BigDecimal("12.3456");
  48. //大部分操作可以加MathContext参数进行设置
  49. System.out.println("绝对值 : " + bd1.abs());
  50. // bd1.abs(MathContext);
  51. System.out.println("+ : " + bd1.add(bd2));//-9+4
  52. System.out.println("- : " + bd1.subtract(bd2));//-9-4
  53. System.out.println("* : " + bd1.multiply(bd2));//-9*4
  54. System.out.println("/ : " + bd1.divide(bd2));//-9/4
  55. System.out.println("商 : " + bd1.divideToIntegralValue(bd2));//-9/4后取整
  56. System.out.println("商、余数 : " + Arrays.asList(bd1.divideAndRemainder(bd2)));//获得商和余数
  57. System.out.println("max : " + bd1.max(bd2));//返回较大值
  58. System.out.println("min : " + bd1.min(bd2));//返回较小值
  59. System.out.println("点左移 : " + bd2.movePointLeft(2));//小数点左移,x10^n
  60. System.out.println("点右移 : " + bd2.movePointRight(3));//小数点右移,x10^-n
  61. System.out.println("(-) : " + bd2.negate());//-this
  62. System.out.println("(+) : " + bd2.plus());//+this
  63. System.out.println("幂 : " + bd2.pow(3));//n次方
  64. System.out.println("有效位数 : " + bd3.precision());//返回有效数字位数
  65. System.out.println("取余 : " + bd1.remainder(bd2));//取余
  66. System.out.println("舍入 : " + bd3.round(new MathContext(4, RoundingMode.DOWN)));//设置四舍五入和有效位数
  67. System.out.println("scale : " + bd3.scale());//小数位数
  68. System.out.println("符号 : " + bd2.signum());//返回符号,返回-1表示负数,返回0表示0,返回1表示正数
  69. System.out.println("sqrt : " + bd2.sqrt(MathContext.DECIMAL64));//开方
  70. System.out.println("比较 : " + bd1.compareTo(bd2));//-1 <, 0 =, 1 >
  71. System.out.println("======转换======");
  72. System.out.println(bd3.doubleValue());
  73. System.out.println(bd3.floatValue());
  74. System.out.println(bd3.intValue());
  75. // System.out.println(bd3.intValueExact());//有非0小数或者超过int长度,抛出异常
  76. System.out.println(bd3.longValue());
  77. // System.out.println(bd3.longValueExact());//有非0小数或者超过long长度,抛出异常
  78. System.out.println(bd3.byteValue());
  79. // System.out.println(bd3.byteValueExact());//有非0小数或者超过byte长度,抛出异常
  80. System.out.println(bd3.shortValue());
  81. // System.out.println(bd3.shortValueExact());//有非0小数或者超过short长度,抛出异常
  82. }
  83. }

运行结果:

注:创建BigDecimal的时候最好使用String,直接使用float或者double会直接造成误差;

关于BigInteger,大部分运算跟BigDecimal一样,也有一些特有方法:

  1. /**
  2. * 2022年7月28日下午3:50:06
  3. */
  4. package testBigDecimal;
  5. import java.math.BigInteger;
  6. import java.util.Random;
  7. /**
  8. * @author XWF
  9. *
  10. */
  11. public class TestBigInteger {
  12. /**
  13. * @param args
  14. */
  15. public static void main(String[] args) {
  16. Random rnd = new Random();
  17. System.out.println(BigInteger.ONE);
  18. System.out.println(BigInteger.TWO);
  19. System.out.println(BigInteger.ZERO);
  20. System.out.println(BigInteger.TEN);
  21. System.out.println(BigInteger.probablePrime(10, rnd));//10bit长的一个随机质数
  22. System.out.println(BigInteger.valueOf(1234567890L));
  23. System.out.println("====================");
  24. System.out.println(new BigInteger(new byte[] {48,57}));
  25. System.out.println(new BigInteger("111"));
  26. System.out.println(new BigInteger(-1, new byte[] {48, 57}));//带正负号的,-1负数,1正数,0只能用于0
  27. System.out.println(new BigInteger(3, rnd));//生成一个3bit的随机整数,0-7
  28. System.out.println(new BigInteger("12", 8));//8进制的12
  29. System.out.println(new BigInteger(new byte[] {1, 2, 3, 4}, 2, 2));//offset,len取byte数组,3=00000011,4=00000100,0000001100000100=772
  30. System.out.println(new BigInteger(6, 10, rnd));//随机6bit长的质数,容忍1-(1/2)^10的准确性
  31. System.out.println(new BigInteger(-1, new byte[] {1, 2, 3, 4}, 2, 2));//带正负号的
  32. System.out.println("====================");
  33. BigInteger bi1 = new BigInteger("2");
  34. BigInteger bi2 = new BigInteger("6");
  35. System.out.println(bi1.and(bi2));//bi1 & bi2
  36. System.out.println(bi1.andNot(bi2));//bi1 & ~bi2
  37. System.out.println(bi2.bitCount());//bit为1的个数
  38. System.out.println(bi2.bitLength());//bit长度
  39. System.out.println(bi2.clearBit(2));//bi2 & ~(1<<n)
  40. System.out.println(bi2.flipBit(1));//bi2 ^ (1<<n)
  41. System.out.println(bi2.gcd(bi1));//最大公约数
  42. System.out.println(bi2.or(bi1));//bi2 | bi1
  43. }
  44. }

运算结果:

关于MathContext,主要用于设置有效位数和设置四舍五入方式;

主要就是RoundingMode枚举里的几种舍入方式:

  • DOWN:朝向0舍入,直观就是去掉舍入位;
  • UP:远离0舍入,去掉舍入位,正数向正方向进1,负数向负方向进1;(舍入位非0才进位,下同)
  • CEILING:朝向正无穷舍入,正数使用UP,负数使用DOWN;
  • FLOOR:朝向负无穷舍入,正数使用DOWN,负数使用UP;
  • HALF_DOWN:五舍六入,舍入>0.5使用UP,否则使用DOWN;
  • HALF_UP:四舍五入,舍入>=0.5使用UP,否则使用DOWN;
  • HALF_EVEN:四舍六入,舍入位=0.5需要分情况,如果舍入位左边是奇数则用HALF_UP(UP),是偶数则用HALF_DOWN(DOWN);
  • UNNECESSARY:不需要舍入,如果给定值不是精确值则抛出ArithmeticException异常;

java文档里的例子:

Demo:

  1. /**
  2. * 2022年7月29日上午9:18:03
  3. */
  4. package testBigDecimal;
  5. import java.math.BigDecimal;
  6. import java.math.MathContext;
  7. import java.math.RoundingMode;
  8. /**
  9. * @author XWF
  10. *
  11. */
  12. public class TestMathContext {
  13. /**
  14. * @param args
  15. */
  16. public static void main(String[] args) {
  17. MathContext mc = MathContext.UNLIMITED;//precision=0 roundingMode=HALF_UP
  18. mc = MathContext.DECIMAL32;//IEEE 754R, HALF_EVEN
  19. mc = MathContext.DECIMAL64;
  20. mc = MathContext.DECIMAL128;
  21. mc = new MathContext(4);//设置有效数字位数
  22. mc = new MathContext("precision=9 roundingMode=HALF_UP");//使用规定格式的字符串创建
  23. mc = new MathContext(4, RoundingMode.CEILING);//设置有效数字位数和四舍五入规则
  24. System.out.println(new BigDecimal("12.3456789", mc));
  25. mc = new MathContext(4, RoundingMode.DOWN);
  26. System.out.println(new BigDecimal("12.3456789", mc));
  27. }
  28. }

相关文章

最新文章

更多