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

    一.安装nodejs 二.安装:pip install PyExecJs 三.js源文件Md5格式存放本地,如下 var n = {}function l(t, e) {var n = (65535 ...

  2. CentOS下配置Nginx实现动静分离实例

    测试环境: CentOS Linux release 7.6 PHP 7.2.32 两台服务器:192.168.1.109(Nginx),192.168.1.118(Apache) 1. 安装配置19 ...

  3. 一个完整的socket recv()案例,包括解决粘包、服务器主动推数据的问题

    前言: 本文是针对socket长连接(涉及到服务器主动推数据),每个包头的拼接算法和长度都不一样,具体的包头小伙伴们问自己公司的开发吧,本文只是提供思路.再啰嗦一句:recv到的包头中数字进行某种运算 ...

  4. videojs文档翻译Guides-components

    components Components Video.js播放器的架构围绕组件. Player类和所有表示播放器控件和其他UI元素的类都继承自Component类. 这种架构使得可以轻松地以反映DO ...

  5. Mybatis-Plus的配置和基本使用

    目录 基本配置 简单使用 代码生成器 基本配置 首先新建一个springboot项目,然后导入数据库驱动,lombok和mybatis-plus依赖: <!-- 数据库驱动 --> < ...

  6. RAID磁盘阵列和RAID配置

    目录 一.RAID磁盘阵列介绍 二.RAID磁盘阵列分类 2.1.RAID 0(条带化存储) 2.2.RAID 1(镜像存储) 2.3.RAID 5 2.4.RAID 6 2.5.RAID 1+0和0 ...

  7. 建立安全SSL连接PostgreSQL数据库服务器

    建立安全SSL连接PostgreSQL数据库服务器当前物联网的挑战之一就是提供最高的安全级别.这就是为什么需要开启SSL连接到 PostgreSQL. 当你想要安全的存储数据到PostgreSQL数据 ...

  8. 探究Presto SQL引擎(1)-巧用Antlr

    一.背景 自2014年大数据首次写入政府工作报告,大数据已经发展7年.大数据的类型也从交易数据延伸到交互数据与传感数据.数据规模也到达了PB级别. 大数据的规模大到对数据的获取.存储.管理.分析超出了 ...

  9. 小白学vue第四天,从入门到放弃(vue指令的使用加高阶函数)

    v-on修饰符的使用 .stop 阻止事件冒泡 调用  stopPropagation() .prevent 阻止默认事件 调用 event.preventDefault() .keyCode 键盘事 ...

  10. UE4点选源码分析

    在UE插件开发中,时常会用到场景预览窗口的功能,也经常会有点选场景里的物体而同步改变工具界面的需求,网上教程多为讲解如何打开一个预览界面.在最近的一次需求开发中,我粗读了关卡编辑器和蓝图编辑器的Vie ...