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进行精确计算工具类的更多相关文章

  1. BigDecimal精确计算工具类

    前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...

  2. java精确计算工具类

    java精确计算工具类 import java.math.BigDecimal; import java.math.RoundingMode; import java.math.BigDecimal; ...

  3. java精确计算、精确计算工具类

    java精确计算 package org.aisino.erp.webservice.dzfp.util; import java.math.BigDecimal; public class Math ...

  4. JAVA简单精确计算工具类

    1 public class ArithUtil { 2 3 // 默认除法运算精度 4 private static final int DEF_DIV_SCALE = 10; 5 6 privat ...

  5. Java-精确计算工具类

    import java.math.BigDecimal; import java.math.RoundingMode; /** * 精确计算工具类(加,减,乘,除,返回较大值,返回较小值) */ pu ...

  6. Java的精确整数计算-Bigdecimal学习总结和工具类

    随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...

  7. Java使用BigDecimal解决精确计算的问题

    最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解 ...

  8. 精度更高的double类型计算工具类(借助BigDecimal类型)

    /** * 提供精確的加法運算 * @param args */ public static double add(double v1, double v2) { BigDecimal b1 = ne ...

  9. Java BigDecimal进行精确计算

    前言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...

随机推荐

  1. HttpSessionListener和HttpSessionBindingListener监听session的销毁

    1. 使用HttpSessionListener public class OnlineUserListener implements HttpSessionListener { public voi ...

  2. 20145337 《Java程序设计》第六周学习总结

    20145337 <Java程序设计>第六周学习总结 教材学习内容总结 输入\输出 InputStream与OutputStream 从应用程序角度来看,如果要将数据从来源取出,可以使用输 ...

  3. java类集框架图(google找的,备个份)

  4. C# 常用结构

    几种常用类的基本结构如下: public Size( double width, double height ) public Point( double x, double y) public Ve ...

  5. uglifyjs压缩批处理

    uglifyjs. 据说是用来压缩JS文件的,据说还能优化JS,据说是基于node的,还据说比Google Closure Compiler更带感. uglifyjs压缩批处理我们不可能每次都打开cm ...

  6. ASP.NET Page执行顺序【转】

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  7. 简单粗暴下载Spring

    http://repo.springsource.org/libs-release-local/org/springframework/spring/4.3.3.RELEASE/(想要下载什么版本,替 ...

  8. XML转换为对象操作类详解

    //XML转换为对象操作类 //一,XML与Object转换类 using System.IO; using System.Runtime.Serialization.Formatters.Binar ...

  9. Spark+Hadoop+Hive集群上数据操作记录

    [rc@vq18ptkh01 ~]$ hadoop fs -ls / drwxr-xr-x+ - jc_rc supergroup 0 2016-11-03 11:46 /dt [rc@vq18ptk ...

  10. SpringMvc异常处理

    SpringMvc通过HandlerExceptionResolver处理程序的异常,包括Handler映射.数据绑定.以及方法执行时发生的异常,SpringMvc提供的HandlerExceptio ...