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. 微信小程序云开发-数据库-删除数据

    一.js文件使用.remove()删除单条数据 在js文件中写updategood函数,在函数中使用.doc()指定要删除的数据id,调用.remove()方法删除数据. 二.wxml文件添加[删除] ...

  2. 在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题

    在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题 笔者提供一个可能会没考虑到的点. 请检查本机是否安装了mssql!!! 请检查本机的ms ...

  3. Delimiter must not be alphanumeric or backslash php报错原因

    昨天写了一个小程序,其中用到了正则表达式去匹配内容.  php源代码如下: preg_match("\b(\w+)\b\s+\1\b",$match):   此报错警告的中文意思是 ...

  4. 接口开发---basic auth接口认证

    开发中遇到了basic auth来认证的案例,这里总结一下: Basic Auth简单点说明就是每次请求API时都提供用户的username和password.[base64encode(userna ...

  5. odoo里面的一些ORM操作

    案例0001sale_obj=self.env['sale.order'].browse(k)通过browse查找对象找到对象里面的 sale_obj.name browse 获取一个数据库id或一个 ...

  6. ASP.NET Datalist制作显示效果和img的数据库存储

    1. 具体实现效果如下图: 2.首先使用datalist控件编辑模板,在属性面板选择RepeatColumns="3" RepeatDirection="Horizont ...

  7. leetcode最短无序连续子数组

    平民解法: 既然是找最小数组,那就得到一个排序好的数组,然后直接和初试数组比对,用一个left,right分别记录从最初开始不同,到最后不同的小标,最后左右做差再加一,就能得到长度. 其他解法: 双指 ...

  8. Linux的链接(入门)

    Linux的链接分为两种:硬链接和软链接 硬链接:如果B是A的硬链接,那么B和A指向同一个文件,但是删除A并不会影响B->允许一个文件有多个路径 软链接:类似Windows下的快捷方式,删除原文 ...

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

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

  10. 查看filesystem type及ftype的值

    查看Filesystem type df -Th 查看ftype xfs_info [filesystem_name]  | grep ftype