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. HTML5初学篇章_4

    HTML5的表单所有type类型(补第一章) 类型 说明 button 定义可点击的按钮(大多与 JavaScript 使用来启动脚本) checkbox 定义复选框. color 定义拾色器. da ...

  2. Spring中的单例一二

    Spring框架很好的帮助我们创建和管理dao.bean.service.action等对象, 但是它创建的对象是单例呢还是多例,又有哪些区别以及为什么 1.在Spring中默认创建的是单例模式,简单 ...

  3. java web用于保持状态的4种方法

    方法一:网址重写 通过在url地址后面添加若干的token作为查询字符串来实现.token的值一般为 键=值 url?key1=value1&key2=value2&...&k ...

  4. sqlserver临时表操作

    创建临时表        方法一:      create table #临时表名(字段1 约束条件,                       字段2 约束条件,                  ...

  5. Visual Studio 2012 常用快捷键

    1. 强迫智能感知:Ctrl+J:2.强迫智能感知显示参数信息:Ctrl-Shift-空格:3.格式化整个块:Ctrl+K+F4. 检查括号匹配(在左右括号间切换): Ctrl +]5. 选中从光标起 ...

  6. fbset 移植

    手头上的文件系统的fbset有问题,所以就自己从新移植一个到开发板上. 参考链接 http://blog.chinaunix.net/uid-20768928-id-5748009.html 下载地址 ...

  7. LeetCode Reconstruct Itinerary

    原题链接在这里:https://leetcode.com/problems/reconstruct-itinerary/ 题目: Given a list of airline tickets rep ...

  8. 关于iOS去除数组中重复数据的几种方法

    关于iOS去除数组中重复数据的几种方法   在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...

  9. soap和http的区别

    Http get,post,soap协议都是在http上运行的1)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的查询字符串的长度受到web浏览器和web服务器的限制 ...

  10. Zabbix通过percona监控MySQL

    因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...