double 类型运算时的 计算的精度不高,常常会出现0.999999999999999这种情况,那么就须要用BigDecimal   它是java提供的用来高精度计算的工具类 以下是对这个类的一个包装,方便使用:

  1. package cn.soft.util;
  2.  
  3. import java.io.Serializable;
  4. import java.math.BigDecimal;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. *类描写叙述: double的计算不精确,会有相似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型
  8. 整型地方法适合于货币精度已知的情况,比方12.11+1.10转成1211+110计算,最后再/100就可以
  9. 下面是摘抄的BigDecimal方法:
  10. *@author: 刘夏楠
  11. *@date: 日期:2014-5-10 时间:上午12:23:21
  12. *@version 1.0
  13. */
  14.  
  15. @Component
  16. public class DoubleUtil implements Serializable {
  17. private static final long serialVersionUID = -3345205828566485102L;
  18. // 默认除法运算精度
  19. private static final Integer DEF_DIV_SCALE = 2;
  20.  
  21. /**
  22. * 提供精确的加法运算。
  23. * @param value1 被加数
  24. * @param value2 加数
  25. * @return 两个參数的和
  26. */
  27. public Double add(Number value1, Number value2) {
  28. BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
  29. BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
  30. return b1.add(b2).doubleValue();
  31. }
  32.  
  33. /**
  34. * 提供精确的减法运算。
  35. *
  36. * @param value1
  37. * 被减数
  38. * @param value2
  39. * 减数
  40. * @return 两个參数的差
  41. */
  42. public double sub(Number value1, Number value2) {
  43. BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
  44. BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
  45. return b1.subtract(b2).doubleValue();
  46. }
  47.  
  48. /**
  49. * 提供精确的乘法运算。
  50. *
  51. * @param value1
  52. * 被乘数
  53. * @param value2
  54. * 乘数
  55. * @return 两个參数的积
  56. */
  57. public Double mul(Number value1, Number value2) {
  58. BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
  59. BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
  60. return b1.multiply(b2).doubleValue();
  61. }
  62.  
  63. /**
  64. * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。
  65. *
  66. * @param dividend
  67. * 被除数
  68. * @param divisor
  69. * 除数
  70. * @return 两个參数的商
  71. */
  72. public Double div(Double dividend, Double divisor) {
  73. return div(dividend, divisor, DEF_DIV_SCALE);
  74. }
  75.  
  76. /**
  77. * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale參数指定精度,以后的数字四舍五入。
  78. *
  79. * @param dividend
  80. * 被除数
  81. * @param divisor
  82. * 除数
  83. * @param scale
  84. * 表示表示须要精确到小数点以后几位。
  85. * @return 两个參数的商
  86. */
  87. public Double div(Double dividend, Double divisor, Integer scale) {
  88. if (scale < 0) {
  89. throw new IllegalArgumentException(
  90. "The scale must be a positive integer or zero");
  91. }
  92. BigDecimal b1 = new BigDecimal(Double.toString(dividend));
  93. BigDecimal b2 = new BigDecimal(Double.toString(divisor));
  94. return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  95. }
  96.  
  97. /**
  98. * 提供精确的小数位四舍五入处理。
  99. *
  100. * @param value
  101. * 须要四舍五入的数字
  102. * @param scale
  103. * 小数点后保留几位
  104. * @return 四舍五入后的结果
  105. */
  106. public Double round(Double value, Integer scale) {
  107. if (scale < 0) {
  108. throw new IllegalArgumentException(
  109. "The scale must be a positive integer or zero");
  110. }
  111. BigDecimal b = new BigDecimal(Double.toString(value));
  112. BigDecimal one = new BigDecimal("1");
  113. return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  114. }
  115. }

Double 类型运算时的精度问题的更多相关文章

  1. double 类型运算会出现精度问题

    要先转换为字符串,后进行运算,可以写个方法做乘法运算public static double mul(double v1,double v2){BigDecimal b1 = new BigDecim ...

  2. 关于Java中用Double型运算时精度丢失的问题

    注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...

  3. 两个Double类型相减出现精度丢失问题

    两个Double类型相减出现精度丢失问题 720.50-279.5=440.099999999 而不是440.1 解决方法,将数据库中的类型改为decimal类型,小数精确到2位

  4. JAVA中double类型运算结果异常的解决

    问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); ...

  5. Double数据运算过程中精度调整

    Double数据进行运算时,容易出现多位小数的精度问题 ①问题现象 ②解决方案 使用BigDecimal类型来进行Double类型数据运算 创建BigDecimal类型对象时将Double类型的数据转 ...

  6. 在使用hibernate注解的时候,想对double类型的字段进行精度约束

    @Column(name = "price",precision = 10,scale = 2) public double getPrice() { return price; ...

  7. 对于final修饰的类型运算时的表现

    我们知道,对于byte,char,这些数据类型加减时都会转化成int在运算,然而,对于final修饰过的数据是不会发生转换的. 比如说 byte b1=1; byte b2=2; byte b3=b1 ...

  8. c语言double类型的输入

    double输入用 %lf ,而不能用 %f 今天在使用double类型输入时先用了 scanf("%lf", &a),结果以%f输出的时候都是0,以%g,%e输出似乎是最 ...

  9. (工具类)double类型数据运算

    package com.flf.util;import java.math.BigDecimal;/** * double类型数据运算 * @author Yancy 2016-12-14 * */p ...

随机推荐

  1. 利用动软代码生成器 自动生成LINQ需要用的数据实体类 (转)

    首先先建立一个模板 名称随意 我起的“生成数据实体.cmt” 代码如下: <#@ template language="c#" HostSpecific="True ...

  2. CreateObject("Wscript.Shell")用法

    WScript.Shell是WshShell对象的ProgID,创建WshShell对象可以运行程序.操作注册表.创建快捷方式.访问系统文件夹.管理环境变量. 该对象有一个run方法. Run 方法创 ...

  3. HDU4739Zhuge Liang's Mines(状压)

    链接 预处理出只有四个1的情况存入数组中 然后状压下 #include <iostream> #include<cstdio> #include<cstring> ...

  4. iOS开发 .framework的Optional(弱引用)和Required(强引用)区别, 有错误 Library not found………………

    http://www.cnblogs.com/wanyakun/p/3494323.html 强引用(Required)的framework是一定会被加载到内存的,但是弱引用(Optional)的fr ...

  5. JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

    分布式开发的历史 利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对Remote远程对象调用 ...

  6. Nginx与X-Sendfile

    X-accel模块允许由后台通过返回的头来决定投递静态文件.为什么要这么做呢?试想一下我们经常碰到的这种情况,在有的论坛中,下载资源需要登录认证.权限核查.积分扣除或者是积分增加等等,对于Nginx来 ...

  7. remove all event handlers from a control

    The sample code below will remove all Click events from button1 public partial class Form1 : Form { ...

  8. 【HTML】Beginner4:Heading

    1.Headings h1 h2 h3 h4 h5 h6     h1 being the almighty emperor of headings     h6 being the lowest p ...

  9. Html笔记(八)其他标签

    <pre></pre> :此标签内封装的文本数据格式将保持原样,包括空格和缩进等格式.常用于页面中显示带有缩进层次的代码. <p></p> :段落标签, ...

  10. bzoj 1922 [Sdoi2010]大陆争霸(最短路变形)

    Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...