java精确计算工具类

java精确计算工具类

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

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )