使用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类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...
随机推荐
- mpdf部署到linux环境中遇到的问题
首先遇到的问题未:Error - mPDF requires mb_string functions. Ensure that PHP is compiled with php_mbstring.dl ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
- Javascript中的new
直接上代码 function test () { } document.write(typeof test() + "<br />") document.write(t ...
- JavaScript 回调函数中的 return false 问题
今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...
- 服务设计模式一:Web服务概述
目录 1. Web服务是什么 2.为什么要使用Web服务 3.Web服务考虑的因素和替代方案 4.SOA是什么 Web服务是什么? 所谓服务,通俗的理解就是别人帮你做一些事情,比如说,腰酸背痛了,找个 ...
- Linux Samba服务器配置
Linux系统默认已经安装了Samba,但是没有安装Samba服务: 1,先查看安装情况:rpm -qa|grep samba 根据系统的安装情况选择下载或者通过光驱安装所缺的rpm包. 我的安装情况 ...
- ASP.NET 文件后缀名详解
sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文件,创建应用程序所需的引用.数据连接.文件夹和文件的信息. .aspx:Web 窗体页由两部分组 ...
- poi jar包的作用
目前POI的最新发布版本是3.10_FINAL.该版本保护的jar包有: Maven artifactId Prerequisites JAR poi commons-logging, commons ...
- 移动端开发tips
为什么使用touch click有300sm的延迟 touch支持多点触摸 手势操作
- Java关于md5加密
package com.mi.util; /** * md5+salt 长度为32的加密 * @author admin * */ public class MD5 { public static v ...