当前位置:首页 > 后端开发 > BigDecimal详解和BigDecimal丢失精度

BigDecimal详解和BigDecimal丢失精度

6个月前 (05-26)46

Java代码 复制代码 收藏代码

  1. import java.math.BigDecimal;   
  2. /**  
  3. * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
  4. * 确的浮点数运算,包括加减乘除和四舍五入。  
  5. */  
  6. public class Arith{ //默认除法运算精度   
  7. private static final int DEF_DIV_SCALE = 10//这个类不能实例化   
  8. private Arith(){   
  9. }   
  10. /**  
  11. * 提供精确的加法运算。  
  12. * @param v1 被加数  
  13. * @param v2 加数  
  14. * @return 两个参数的和  
  15. */  
  16. public static double add(double v1,double v2){   
  17. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  18. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  19. return b1.add(b2).doubleValue();   
  20. }   
  21. /**  
  22. * 提供精确的减法运算。  
  23. * @param v1 被减数  
  24. * @param v2 减数  
  25. * @return 两个参数的差  
  26. */  
  27. public static double sub(double v1,double v2){   
  28. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  29. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  30. return b1.subtract(b2).doubleValue();   
  31. }   
  32. /**  
  33. * 提供精确的乘法运算。  
  34. * @param v1 被乘数  
  35. * @param v2 乘数  
  36. * @return 两个参数的积  
  37. */  
  38. public static double mul(double v1,double v2){   
  39. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  40. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  41. return b1.multiply(b2).doubleValue();   
  42. }   
  43. /**  
  44. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
  45. * 小数点以后10位,以后的数字四舍五入。  
  46. * @param v1 被除数  
  47. * @param v2 除数  
  48. * @return 两个参数的商  
  49. */  
  50. public static double div(double v1,double v2){   
  51. return div(v1,v2,DEF_DIV_SCALE);   
  52. }   
  53. /**  
  54. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
  55. * 定精度,以后的数字四舍五入。  
  56. * @param v1 被除数  
  57. * @param v2 除数  
  58. * @param scale 表示表示需要精确到小数点以后几位。  
  59. * @return 两个参数的商  
  60. */  
  61. public static double div(double v1,double v2,int scale){   
  62. if(scale<0){   
  63. throw new IllegalArgumentException(   
  64. "The scale must be a positive integer or zero");   
  65. }   
  66. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
  67. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
  68. return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
  69. }   
  70. /**  
  71. * 提供精确的小数位四舍五入处理。  
  72. * @param v 需要四舍五入的数字  
  73. * @param scale 小数点后保留几位  
  74. * @return 四舍五入后的结果  
  75. */  
  76. public static double round(double v,int scale){   
  77. if(scale<0){   
  78. throw new IllegalArgumentException("The scale must be a positive integer or zero");   
  79. }   
  80. BigDecimal b = new BigDecimal(Double.toString(v));   
  81. BigDecimal one = new BigDecimal("1");   
  82. return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
  83. }   
  84. };  

 

友情提示(丢失精度的原因):

有小数点的值,不论加减乘除,如果不转成字符串,会发生丢失精度的情况;

比如BigDecimal bd= new BigDecimal(0.48);

作者:程序猿-Allen
来源链接:https://blog.csdn.net/luohao_/article/details/79010540

标签: BigDecimal

“BigDecimal详解和BigDecimal丢失精度” 的相关文章

BigDecimal精度丢失处理

BigDecimal 有参构造方法,传入 double,float 会丢失精度。 运行下面代码,期待结果都是11、1.1、1...

JAVA BigDecimal总结

一、BigDecimal概述   Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理...

BigDecimal详解

一.讨论这个问题的缘由 经常会遇到浮点数溢出的问题,这个问题在前端和后端的代码中都多次出现过,因为业务涉及金钱,给用户展示一个溢出的结果肯定会引起误解和不满,因此程序员...

[转]BigDecimal使用(整理)

原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.B...

Java BigDecimal和double

BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用Bi...

BigDecimal加减乘除运算

BigDecimal加减乘除运算

java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val)Translat...

BigDecimal.valueOf

BigDecimal.valueOf

Those are two separate questions: "What should I use for BigDe...

BigDecimal的相加问题

1、累加int型数据 对于使用BigDecimal的add方法进行相加操作时,累加整型的数据没有问题,但是当我们累加BigDecimal类型的...

BigDecimal的一些了解

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或...

BigDecimal使用时的参数详解

下面我们来看看BigDecimal的setScale方法 BigDecimal.setScale()方法用于格式化小数点 表示保留一位小数,默认用四舍五入方式se...