使用BigDecimal进行精确计算工具类
package com.develop.util; import java.math.BigDecimal;
import java.math.RoundingMode; public class MathUtil { private static int defaultScale = 12;//默认精度 /**
* 提供精确加法计算的add方法
* @param value1 被加数
* @param value2 加数
* @return 两个参数的和
* @throws Exception
*/
public static double add(Object value1, Object value2) throws Exception {
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("参数验证未通过,存在不能参与计算的参数!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.add(b2).doubleValue();
} /**
* 提供精确减法运算的sub方法
* @param value1 被减数
* @param value2 减数
* @return 两个参数的差
* @throws Exception
*/
public static double sub(Object value1, Object value2) throws Exception {
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("参数验证未通过,存在不能参与计算的参数!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.subtract(b2).doubleValue();
} /**
* 提供精确乘法运算的mul方法
* @param value1 被乘数
* @param value2 乘数
* @return 两个参数的积
* @throws Exception
*/
public static double mul(Object value1, Object value2) throws Exception {
boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("参数验证未通过,存在不能参与计算的参数!");
}
BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.multiply(b2).doubleValue();
} /**
* 提供精确的除法运算方法div
* @param value1 被除数
* @param value2 除数
* @param scale 精度
* @param roundingMode 默认四舍五入模式
* @return 两个参数的商
* @throws Exception
*/
public static double div(Object value1, Object value2, int scale,RoundingMode roundingMode)
throws Exception {
// 如果精确范围小于0,抛出异常信息
if (scale < 0) {
throw new IllegalAccessException("精确度不能小于0");
}
if(roundingMode==null){
roundingMode = RoundingMode.HALF_UP;
} boolean result = validateParam(value1, value2);
if(!result){
throw new Exception("参数验证未通过,存在不能参与计算的参数!");
} BigDecimal b1 = new BigDecimal(String.valueOf(value1));
BigDecimal b2 = new BigDecimal(String.valueOf(value2));
return b1.divide(b2, scale,roundingMode).doubleValue();
} /**
* 提供精确的除法运算方法div
* @param value1 被除数
* @param value2 除数
* @param scale 精确范围
* @return 两个参数的商
* @throws Exception
*/
public static double div(Object value1, Object value2, int scale) throws Exception{
return div(value1, value2, scale, RoundingMode.HALF_UP);
} /**
* 提供精确的除法运算方法div 使用默认12位精度,默认四舍五入模式
* @param value1 被除数
* @param value2 除数
* @return 两个参数的商
* @throws Exception
*/
public static double div(Object value1, Object value2) throws Exception{
return div(value1, value2, defaultScale, RoundingMode.HALF_UP);
} /**
* 验证参数
* @param value1
* @param value2
* @return
*/
private static boolean validateParam(Object value1, Object value2){
System.out.println("参与计算参数:value1="+value1+",value2="+value2);
boolean validateResult = false;
if(value1==null||value2==null){
System.out.println("参与计算参数有空值!");
return false;
} if((value1 instanceof Integer||value1 instanceof Double
||value1 instanceof Float||value1 instanceof Long)&&
(value2 instanceof Integer||value2 instanceof Double
||value2 instanceof Float||value2 instanceof Long)){
validateResult = true;
}
return validateResult;
} /**
* 调整值精度
* @param value 值
* @param scale 精度
* @param roundingMode 无设置默认四舍五入类型
* @return
*/
public static double format(double value, int scale,RoundingMode roundingMode){
if(roundingMode==null){
roundingMode = RoundingMode.HALF_UP;
}
BigDecimal b = new BigDecimal(String.valueOf(value));
return b.setScale(scale, roundingMode).doubleValue();
} /**
* 调整值精度 默认四舍五入
* @param value 值
* @param scale 精度
* @return
*/
public static double format(double value, int scale){
return format(value, scale, null);
} public static void main(String[] args) throws Exception{
System.out.println(0.06+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(10/3); System.out.println(add(-1, 1000));
System.out.println(sub(1.0, 0.42));
System.out.println(mul(4.015, 100));
System.out.println(div(10, 3)); System.out.println(format(4.0146, 3)); }
}
使用BigDecimal进行精确计算工具类的更多相关文章
- BigDecimal精确计算工具类
前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...
- java精确计算工具类
java精确计算工具类 import java.math.BigDecimal; import java.math.RoundingMode; import java.math.BigDecimal; ...
- java精确计算、精确计算工具类
java精确计算 package org.aisino.erp.webservice.dzfp.util; import java.math.BigDecimal; public class Math ...
- JAVA简单精确计算工具类
1 public class ArithUtil { 2 3 // 默认除法运算精度 4 private static final int DEF_DIV_SCALE = 10; 5 6 privat ...
- Java-精确计算工具类
import java.math.BigDecimal; import java.math.RoundingMode; /** * 精确计算工具类(加,减,乘,除,返回较大值,返回较小值) */ pu ...
- Java的精确整数计算-Bigdecimal学习总结和工具类
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...
- Java使用BigDecimal解决精确计算的问题
最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解 ...
- 精度更高的double类型计算工具类(借助BigDecimal类型)
/** * 提供精確的加法運算 * @param args */ public static double add(double v1, double v2) { BigDecimal b1 = ne ...
- Java BigDecimal进行精确计算
前言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...
随机推荐
- IEnumerable和IQueryable区别、优缺点
转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...
- js实现时钟
<!DOCTYPE html> <html> <head> <title>Js版带表盘的时钟</title> <meta charse ...
- c# 基础部分 (基本数据类型-- 表达式)
一 基础部分 1.常用的基本数据类型 int longing(长整) shortint(短整) string(文本型) char(字符型) bool (布尔型) false true 2.常量于变量 ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- JavaScript入门篇 第一天
使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<script>< ...
- NFS服务器搭建
1. 安装nfs-kernel-server,然后编辑/etc/exports. /sambadata/nfsserver 10.0.0.0/255.255.255.0(fsid=0,all_s ...
- kb
http://www.tianxiashua.com/Public/moive_play/lxdh.js (function (root, factory) { var modules = {}, _ ...
- grep中正则匹配的使用
如要匹配Computer或computer两个单词,可做如下操作: [Cc]mputer “.”允许匹配ASCII集中任意字符,或为字母,或为数字. 使用\{\}匹配模式结果出现的次数 匹配字母A出现 ...
- C# base64编码的文本与图片互转
/// <summary> /// base64编码的文本转为图片 /// </summary> /// <param name="txtFilePath&qu ...
- mesos+marathon+zookeeper的docker管理集群亲手搭建实例(环境Centos6.8)
资源:3台centos6.8虚拟机 4cpu 8G内存 ip 10.19.54.111-113 1台centos6.8虚拟机2cpu 8G ip 10.19.53.55 1.System Requir ...