JAVA简单精确计算工具类
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简单精确计算工具类的更多相关文章
- java精确计算工具类
java精确计算工具类 import java.math.BigDecimal; import java.math.RoundingMode; import java.math.BigDecimal; ...
- BigDecimal精确计算工具类
前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...
- java精确计算、精确计算工具类
java精确计算 package org.aisino.erp.webservice.dzfp.util; import java.math.BigDecimal; public class Math ...
- 使用BigDecimal进行精确计算工具类
package com.develop.util; import java.math.BigDecimal; import java.math.RoundingMode; public class M ...
- Java-精确计算工具类
import java.math.BigDecimal; import java.math.RoundingMode; /** * 精确计算工具类(加,减,乘,除,返回较大值,返回较小值) */ pu ...
- Java日期时间实用工具类
Java日期时间实用工具类 1.Date (java.util.Date) Date(); 以当前时间构造一个Date对象 Date(long); 构造函数 ...
- Redis 工具类 java 实现的redis 工具类
最近了解了一下非关系型数据库 redis 会使用简单的命令 在自己本地电脑 使用时必须先启动服务器端 在启动客户端 redis 简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...
- Java 后台验证的工具类
Java 后台验证的工具类 public class ValidationUtil { //手机号 public static String mobile = "^( ...
- java后端时间处理工具类,返回 "XXX 前" 的字符串
转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...
随机推荐
- 解决clipboard.js在移动端复制失败的问题
1.前沿 在项目中使用clipboard.js插件去实现点击按钮,复制一段网址到剪切板的功能.功能做好后,一开始无论这pc端还是移动端都能正常使用.突然某一天测出了一个bug:移动端复制失败,pc端是 ...
- 超详细!Vuex手把手教程
目录 1,前言 2,Vuex 是什么 3,5大属性说明 4,state 4.1 直接访问 4.1 使用mapState映射 5,getters 5.1 先在vuex中定义getters 5.2 直接获 ...
- SpringBoot读取Resource下文件的几种方式(十五)
需求:提供接口下载resources目录下的模板文件,(或者读取resources下的文件)给后续批量导入数据提供模板文件. 方式一:ClassPathResource //获取模板文件:注意此处需要 ...
- python基础问题
包安装相关问:如何安装Python三方包?在命令行如何检查一个包是否已安装?答:安装用pip install 卸载用 pip uninstall 直接import 这个包问:环境变量PATH的作用是什 ...
- PGSQL存储过程学习
一.存储过程定义: 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参 ...
- CAS 原理 应用
原子CAS操作 原子操作指令里,有原子加,原子减,cas到底是什么呢? 首先看一段代码, bool compare_and_swap(int *accum, int *dest, int newval ...
- Intouch 制作自定义登录弹窗
在新的自动化项目中,因为业主对设计审美要求比较高,对Intouch自带脚本呼出登录窗体不满意,故而制作自定义登录弹窗来满足其审美需求.在寻求自控群前辈的经验下,将其整理成博客,供大家参考. 1.登录窗 ...
- Centos 7 安装mysql5.7 nginx tomcat
- Matlab的datenum()函数用法
Matlab的datenum()函数用法 将日期和时间转换为日期序列值 datenum 函数创建一个数值数组,将每个时间点表示为从 0000 年 1 月 0 日起的天数.数值还能表示以天为单位的过去时 ...
- js控制单选按钮选中某一项
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...