1. 1 public class ArithUtil {
  2. 2
  3. 3 // 默认除法运算精度
  4. 4 private static final int DEF_DIV_SCALE = 10;
  5. 5
  6. 6 private ArithUtil() {
  7. 7
  8. 8 }
  9. 9
  10. 10 /**
  11. 11 * 提供精确的加法运算。
  12. 12 *
  13. 13 * @param v1
  14. 14 * 被加数
  15. 15 * @param v2
  16. 16 * 加数
  17. 17 * @return 两个参数的和
  18. 18 */
  19. 19 public static double add(double v1, double v2) {
  20. 20 BigDecimal b1 = new BigDecimal(Double.toString(v1));
  21. 21 BigDecimal b2 = new BigDecimal(Double.toString(v2));
  22. 22 return b1.add(b2).doubleValue();
  23. 23 }
  24. 24
  25. 25 public static double add(double v1, double v2,int scale) {
  26. 26 BigDecimal b1 = new BigDecimal(Double.toString(v1)).setScale(scale, BigDecimal.ROUND_HALF_DOWN);
  27. 27 BigDecimal b2 = new BigDecimal(Double.toString(v2)).setScale(scale, BigDecimal.ROUND_HALF_DOWN);
  28. 28 return b1.add(b2).doubleValue();
  29. 29 }
  30. 30 /**
  31. 31 * 提供精确的减法运算。
  32. 32 *
  33. 33 * @param v1
  34. 34 * 被减数
  35. 35 * @param v2
  36. 36 * 减数
  37. 37 * @return 两个参数的差
  38. 38 */
  39. 39 public static double sub(double v1, double v2) {
  40. 40 BigDecimal b1 = new BigDecimal(Double.toString(v1));
  41. 41 BigDecimal b2 = new BigDecimal(Double.toString(v2));
  42. 42 return b1.subtract(b2).doubleValue();
  43. 43 }
  44. 44
  45. 45 public static double sub(double v1, double v2,int scale) {
  46. 46 BigDecimal b1 = new BigDecimal(Double.toString(v1)).setScale(scale, BigDecimal.ROUND_HALF_DOWN);
  47. 47 BigDecimal b2 = new BigDecimal(Double.toString(v2)).setScale(scale, BigDecimal.ROUND_HALF_DOWN);
  48. 48 return b1.subtract(b2).doubleValue();
  49. 49 }
  50. 50 /**
  51. 51 * 提供精确的乘法运算。
  52. 52 *
  53. 53 * @param v1
  54. 54 * 被乘数
  55. 55 * @param v2
  56. 56 * 乘数
  57. 57 * @return 两个参数的积
  58. 58 */
  59. 59 public static double mul(double v1, double v2) {
  60. 60 BigDecimal b1 = new BigDecimal(Double.toString(v1));
  61. 61 BigDecimal b2 = new BigDecimal(Double.toString(v2));
  62. 62 return b1.multiply(b2).doubleValue();
  63. 63 }
  64. 64
  65. 65 /**
  66. 66 * 提供精确的乘法运算。
  67. 67 *
  68. 68 * @param v1
  69. 69 * 被乘数
  70. 70 * @param v2
  71. 71 * 乘数
  72. 72 * @return 两个参数的积
  73. 73 */
  74. 74 public static double mul(double v1, double v2,int scale) {
  75. 75 BigDecimal b1 = new BigDecimal(Double.toString(v1));
  76. 76 BigDecimal b2 = new BigDecimal(Double.toString(v2));
  77. 77 return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  78. 78 }
  79. 79 /**
  80. 80 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
  81. 81 *
  82. 82 * @param v1
  83. 83 * 被除数
  84. 84 * @param v2
  85. 85 * 除数
  86. 86 * @return 两个参数的商
  87. 87 */
  88. 88 public static double div(double v1, double v2) {
  89. 89 return div(v1, v2, DEF_DIV_SCALE);
  90. 90 }
  91. 91
  92. 92 /**
  93. 93 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
  94. 94 *
  95. 95 * @param v1
  96. 96 * 被除数
  97. 97 * @param v2
  98. 98 * 除数
  99. 99 * @param scale
  100. 100 * 表示表示需要精确到小数点以后几位。
  101. 101 * @return 两个参数的商
  102. 102 */
  103. 103 public static double div(double v1, double v2, int scale) {
  104. 104 if (scale < 0) {
  105. 105 throw new IllegalArgumentException("参数scale必须为整数为零!");
  106. 106 }
  107. 107 BigDecimal b1 = new BigDecimal(Double.toString(v1));
  108. 108 BigDecimal b2 = new BigDecimal(Double.toString(v2));
  109. 109 return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  110. 110 }
  111. 111
  112. 112 /**
  113. 113 * 提供精确的小数位四舍五入处理。
  114. 114 *
  115. 115 * @param v
  116. 116 * 需要四舍五入的数字
  117. 117 * @param scale
  118. 118 * 小数点后保留几位
  119. 119 * @return 四舍五入后的结果
  120. 120 */
  121. 121 public static double round(double v, int scale) {
  122. 122 if (scale < 0) {
  123. 123 throw new IllegalArgumentException("参数scale必须为整数为零!");
  124. 124 }
  125. 125 BigDecimal b = new BigDecimal(Double.toString(v));
  126. 126 BigDecimal one = new BigDecimal("1");
  127. 127 return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  128. 128 }
  129. 129
  130. 130 /**
  131. 131 * 提供精确的类型转换(Float)
  132. 132 *
  133. 133 * @param v
  134. 134 * 需要被转换的数字
  135. 135 * @return 返回转换结果
  136. 136 */
  137. 137 public static float convertsToFloat(double v) {
  138. 138 BigDecimal b = new BigDecimal(v);
  139. 139 return b.floatValue();
  140. 140 }
  141. 141
  142. 142 /**
  143. 143 * 提供精确的类型转换(Int)不进行四舍五入
  144. 144 *
  145. 145 * @param v
  146. 146 * 需要被转换的数字
  147. 147 * @return 返回转换结果
  148. 148 */
  149. 149 public static int convertsToInt(double v) {
  150. 150 BigDecimal b = new BigDecimal(v);
  151. 151 return b.intValue();
  152. 152 }
  153. 153
  154. 154 /**
  155. 155 * 提供精确的类型转换(Long)
  156. 156 *
  157. 157 * @param v
  158. 158 * 需要被转换的数字
  159. 159 * @return 返回转换结果
  160. 160 */
  161. 161 public static long convertsToLong(double v) {
  162. 162 BigDecimal b = new BigDecimal(v);
  163. 163 return b.longValue();
  164. 164 }
  165. 165
  166. 166 /**
  167. 167 * 返回两个数中大的一个值
  168. 168 *
  169. 169 * @param v1
  170. 170 * 需要被对比的第一个数
  171. 171 * @param v2
  172. 172 * 需要被对比的第二个数
  173. 173 * @return 返回两个数中大的一个值
  174. 174 */
  175. 175 public static double returnMax(double v1, double v2) {
  176. 176 BigDecimal b1 = new BigDecimal(v1);
  177. 177 BigDecimal b2 = new BigDecimal(v2);
  178. 178 return b1.max(b2).doubleValue();
  179. 179 }
  180. 180
  181. 181 /**
  182. 182 * 返回两个数中小的一个值
  183. 183 *
  184. 184 * @param v1
  185. 185 * 需要被对比的第一个数
  186. 186 * @param v2
  187. 187 * 需要被对比的第二个数
  188. 188 * @return 返回两个数中小的一个值
  189. 189 */
  190. 190 public static double returnMin(double v1, double v2) {
  191. 191 BigDecimal b1 = new BigDecimal(v1);
  192. 192 BigDecimal b2 = new BigDecimal(v2);
  193. 193 return b1.min(b2).doubleValue();
  194. 194 }
  195. 195
  196. 196 /**
  197. 197 * 精确比较两个数字
  198. 198 *
  199. 199 * @param v1
  200. 200 * 需要被对比的第一个数
  201. 201 * @param v2
  202. 202 * 需要被对比的第二个数
  203. 203 * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
  204. 204 */
  205. 205 public static int compareTo(double v1, double v2) {
  206. 206 BigDecimal b1 = new BigDecimal(v1);
  207. 207 BigDecimal b2 = new BigDecimal(v2);
  208. 208 return b1.compareTo(b2);
  209. 209 }
  210. 210
  211. 211 /**
  212. 212 * 获取数字小数位数
  213. 213 *
  214. 214 * @param number
  215. 215 * 数字.
  216. 216 *
  217. 217 * @return 小数位数
  218. 218 */
  219. 219 public static int getDecimals(double number) {
  220. 220 DecimalFormat decimalFormat = new DecimalFormat("#.####");
  221. 221 String numberString = decimalFormat.format(number);
  222. 222 if (numberString.indexOf(".") > 0) {
  223. 223 return numberString.length() - String.valueOf(number).indexOf(".") - 1;
  224. 224 } else {
  225. 225 return 0;
  226. 226 }
  227. 227 }
  228. 228
  229. 229 /**
  230. 230 * 获取数字小数位数
  231. 231 *
  232. 232 * @param number
  233. 233 * 数字.
  234. 234 *
  235. 235 * @return 小数位数
  236. 236 */
  237. 237 public static int getDecimals(float number) {
  238. 238 DecimalFormat decimalFormat = new DecimalFormat("#.####");
  239. 239 String numberString = decimalFormat.format(number);
  240. 240 if (numberString.indexOf(".") > 0) {
  241. 241 return numberString.length() - String.valueOf(number).indexOf(".") - 1;
  242. 242 } else {
  243. 243 return 0;
  244. 244 }
  245. 245 }
  246. 246 }

JAVA简单精确计算工具类的更多相关文章

  1. java精确计算工具类

    java精确计算工具类 import java.math.BigDecimal; import java.math.RoundingMode; import java.math.BigDecimal; ...

  2. BigDecimal精确计算工具类

    前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...

  3. java精确计算、精确计算工具类

    java精确计算 package org.aisino.erp.webservice.dzfp.util; import java.math.BigDecimal; public class Math ...

  4. 使用BigDecimal进行精确计算工具类

    package com.develop.util; import java.math.BigDecimal; import java.math.RoundingMode; public class M ...

  5. Java-精确计算工具类

    import java.math.BigDecimal; import java.math.RoundingMode; /** * 精确计算工具类(加,减,乘,除,返回较大值,返回较小值) */ pu ...

  6. Java日期时间实用工具类

    Java日期时间实用工具类 1.Date (java.util.Date)    Date();        以当前时间构造一个Date对象    Date(long);        构造函数   ...

  7. Redis 工具类 java 实现的redis 工具类

    最近了解了一下非关系型数据库 redis 会使用简单的命令 在自己本地电脑 使用时必须先启动服务器端 在启动客户端 redis 简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...

  8. Java 后台验证的工具类

    Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^( ...

  9. java后端时间处理工具类,返回 "XXX 前" 的字符串

    转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...

随机推荐

  1. web自动化测试(2):选择selenium优势?与PhantomJS/QTP/Monkey对比

    上篇 <web自动化测试(1):再谈UI发展史与UI.功能自动化测试>,自动化测试工具众多, PC端常用的功能自动化测试工具 Selenium:开源工具集,用于回归功能测试或者系统用例说明 ...

  2. Attention和Transformer详解

    目录 Transformer引入 Encoder 详解 输入部分 Embedding 位置嵌入 注意力机制 人类的注意力机制 Attention 计算 多头 Attention 计算 残差及其作用 B ...

  3. [考试总结]noip模拟16

    达成成就,一天更3篇总结. 又是一个暴力场 别问我为什么开局 \(5\) 分钟就问老师为什么 \(T3\) 没有提交的窗口. 开题读题,一路自闭到 \(T3\) ,发现 \(T3\) 可打暴力,所以一 ...

  4. Skywalking-04:扩展Metric监控信息

    扩展 Metric 监控信息 官方文档 Source and Scope extension for new metrics 案例:JVM Thread 增加 Metrics 修改 Thread 的定 ...

  5. SQL注入之二次,加解密,DNS等注入

    #sql注入之二次注入 1.注入原理 二次注入可以理解为,构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入.恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当 ...

  6. 高德开放平台实现批量自定义marker和信息窗体显示

    上篇博客提到云图无法实现文本标签标记marker,这篇博客着重实现在marker点文本标记以及自定义按钮窗体显示. 1.效果: 2.代码实现 <!doctype html> <htm ...

  7. homeless靶机

    仅供个人娱乐 靶机信息 下载地址:https://www.vulnhub.com/entry/homeless-1,215/ 一.主机扫描 二.信息收集 在网页源码和页面上,我们发现User-Agen ...

  8. Go语言常见的坑

    目录 1. 可变参数是空接口类型 2. 数组是值传递 3.map遍历是顺序不固定 4. 返回值被屏蔽 5.recover必须在defer函数中运行 6. main函数提前退出 7.通过Sleep来回避 ...

  9. 【NLP学习其四】如何构建自己用于训练的数据集?什么是词性标注?

    数据集与词性标注 数据集是NLP中的重要一环. 但是提到数据集,很多人的第一个想法可能是:"这玩意从网上下载就好了,不用管". 真的不用管?最开始我也是这么认为的 于是我直奔CoN ...

  10. Prometheus MySQL监控+grafana展示

    前言 最近爱上了研究各种杂七杂八的技术. Prometheus是现如今最火的监控软件之一.做为一个运维DBA,不会这个可就OUT了. 本篇博客,演示一下prometheus之通过mysql expor ...