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 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...
随机推荐
- web自动化测试(2):选择selenium优势?与PhantomJS/QTP/Monkey对比
上篇 <web自动化测试(1):再谈UI发展史与UI.功能自动化测试>,自动化测试工具众多, PC端常用的功能自动化测试工具 Selenium:开源工具集,用于回归功能测试或者系统用例说明 ...
- Attention和Transformer详解
目录 Transformer引入 Encoder 详解 输入部分 Embedding 位置嵌入 注意力机制 人类的注意力机制 Attention 计算 多头 Attention 计算 残差及其作用 B ...
- [考试总结]noip模拟16
达成成就,一天更3篇总结. 又是一个暴力场 别问我为什么开局 \(5\) 分钟就问老师为什么 \(T3\) 没有提交的窗口. 开题读题,一路自闭到 \(T3\) ,发现 \(T3\) 可打暴力,所以一 ...
- Skywalking-04:扩展Metric监控信息
扩展 Metric 监控信息 官方文档 Source and Scope extension for new metrics 案例:JVM Thread 增加 Metrics 修改 Thread 的定 ...
- SQL注入之二次,加解密,DNS等注入
#sql注入之二次注入 1.注入原理 二次注入可以理解为,构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入.恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当 ...
- 高德开放平台实现批量自定义marker和信息窗体显示
上篇博客提到云图无法实现文本标签标记marker,这篇博客着重实现在marker点文本标记以及自定义按钮窗体显示. 1.效果: 2.代码实现 <!doctype html> <htm ...
- homeless靶机
仅供个人娱乐 靶机信息 下载地址:https://www.vulnhub.com/entry/homeless-1,215/ 一.主机扫描 二.信息收集 在网页源码和页面上,我们发现User-Agen ...
- Go语言常见的坑
目录 1. 可变参数是空接口类型 2. 数组是值传递 3.map遍历是顺序不固定 4. 返回值被屏蔽 5.recover必须在defer函数中运行 6. main函数提前退出 7.通过Sleep来回避 ...
- 【NLP学习其四】如何构建自己用于训练的数据集?什么是词性标注?
数据集与词性标注 数据集是NLP中的重要一环. 但是提到数据集,很多人的第一个想法可能是:"这玩意从网上下载就好了,不用管". 真的不用管?最开始我也是这么认为的 于是我直奔CoN ...
- Prometheus MySQL监控+grafana展示
前言 最近爱上了研究各种杂七杂八的技术. Prometheus是现如今最火的监控软件之一.做为一个运维DBA,不会这个可就OUT了. 本篇博客,演示一下prometheus之通过mysql expor ...