当前位置:   article > 正文

BigDecimal_bigdecimal 线程安全

bigdecimal 线程安全

 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。

如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)


  1. 构造 BigDecimal 对象常用以下方法:
  2. BigDecimal BigDecimal(double d); //不允许使用
  3. BigDecimal BigDecimal(String s); //常用,推荐使用
  4. static BigDecimal valueOf(double d); //常用,推荐使用


 

  1. /**
  2. * 求余数
  3. * 返回值为 (this % divisor) 的 BigDecimal
  4. */
  5. BigDecimal remainder(BigDecimal divisor);
  6. /**
  7. * 求相反数
  8. * 返回值是 (-this) 的 BigDecimal
  9. */
  10. BigDecimal negate();
  11. /**
  12. * 将此 BigDecimal 与指定的 BigDecimal 比较
  13. * 根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的;
  14. * 相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法;
  15. * 建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0), 其中 <op> 是六个比较运算符之一;
  16. *
  17. * 指定者:接口 Comparable<BigDecimal> 中的 compareTo
  18. * 返回:当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1
  19. */
  20. int compareTo(BigDecimal val);
  1. package com.util;
  2. import java.math.BigDecimal;
  3. /**
  4. * 提供精确的浮点数运算(包括加、减、乘、除、四舍五入)工具类
  5. */
  6. public class ArithUtil {
  7. // 除法运算默认精度
  8. private static final int DEF_DIV_SCALE = 10;
  9. private ArithUtil() {
  10. }
  11. /**
  12. * 精确加法
  13. */
  14. public static double add(double value1, double value2) {
  15. BigDecimal b1 = BigDecimal.valueOf(value1);
  16. BigDecimal b2 = BigDecimal.valueOf(value2);
  17. return b1.add(b2).doubleValue();
  18. }
  19. /**
  20. * 精确减法
  21. */
  22. public static double sub(double value1, double value2) {
  23. BigDecimal b1 = BigDecimal.valueOf(value1);
  24. BigDecimal b2 = BigDecimal.valueOf(value2);
  25. return b1.subtract(b2).doubleValue();
  26. }
  27. /**
  28. * 精确乘法
  29. */
  30. public static double mul(double value1, double value2) {
  31. BigDecimal b1 = BigDecimal.valueOf(value1);
  32. BigDecimal b2 = BigDecimal.valueOf(value2);
  33. return b1.multiply(b2).doubleValue();
  34. }
  35. /**
  36. * 精确除法 使用默认精度
  37. */
  38. public static double div(double value1, double value2) throws IllegalAccessException {
  39. return div(value1, value2, DEF_DIV_SCALE);
  40. }
  41. /**
  42. * 精确除法
  43. * @param scale 精度
  44. */
  45. public static double div(double value1, double value2, int scale) throws IllegalAccessException {
  46. if(scale < 0) {
  47. throw new IllegalAccessException("精确度不能小于0");
  48. }
  49. BigDecimal b1 = BigDecimal.valueOf(value1);
  50. BigDecimal b2 = BigDecimal.valueOf(value2);
  51. // return b1.divide(b2, scale).doubleValue();
  52. return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  53. }
  54. /**
  55. * 四舍五入
  56. * @param scale 小数点后保留几位
  57. */
  58. public static double round(double v, int scale) throws IllegalAccessException {
  59. return div(v, 1, scale);
  60. }
  61. /**
  62. * 比较大小
  63. */
  64. public static boolean equalTo(BigDecimal b1, BigDecimal b2) {
  65. if(b1 == null || b2 == null) {
  66. return false;
  67. }
  68. return 0 == b1.compareTo(b2);
  69. }
  70. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/560602
推荐阅读
相关标签
  

闽ICP备14008679号