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 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...
随机推荐
- 深入理解JavaScript中的继承
1前言 继承是JavaScript中的重要概念,可以说要学好JavaScript,必须搞清楚JavaScript中的继承.我最开始是通过看视频听培训班的老师讲解的JavaScript中的继承,当时看的 ...
- python编程面试题
# 实现需求为 注册.登录.查看昵称的功能 # def userN(): # username = input("请输入账号: \n") # password = ...
- 微信小程序云开发-数据条件查询
一.使用where条件查询 在.get()语句之前增加.where语句实现条件查询. 二.通过doc查询单条数据 1.使用doc来查询数据库中的单条数据 2.定义一个空对象,用来展示插叙到的单条数据 ...
- Scanner的基本语法及用法
一.Scanner对象 基本语法中并没有实现程序和人的交互,但是Java给我们提供了一个这样的工具类,我们可以获取用户的输入.java.util.Scanner是Java5的新特征,我们可以通过Sca ...
- 【动态规划DP】[USACO16OPEN]248
题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small to ...
- odoo14里自定义批量下载数据【excel】
1.创建一个向导模型: from odoo import models, fields, api import base64 import xlwt from io import BytesIO cl ...
- python中的abstractmethod
# -*- coding: utf-8 -*- from abc import ABC ,abstractclassmethod from collections import namedtuple ...
- JMX远程连接JVM
-Dcom.sun.management.jmxremote :允许使用JMX远程管理 -Dcom.sun.management.jmxremote.port=9999 :JMX远程连接端口 -Dco ...
- Python小白的数学建模课-10.微分方程边值问题
小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型边值问题的建模与求解,不涉及算法推导和编程,只探讨如何使用 Pytho ...
- LeetCode通关:数组十七连,真是不简单
分门别类刷算法,坚持,进步! 刷题路线参考:https://github.com/chefyuan/algorithm-base https://github.com/youngyangy ...