BigDecimal精确计算工具类
前言
在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算。而这类操作通常都是可预知的,也就是通用的。所以,写了个工具类来方便以后的工作。
这是仓库地址:仓库地址
BigDecimal的构建
一般而言,我们主要从int,long,double,float来进行计算,在构建的时候推荐使用
BigDecimal BigDecimal(String s);
因为通过double构造会损失精度,而String构造是固定的值。
创建以下方法作为通用BigDecimal转化器:
/**
* Number -> BigDecimal
*/
public static <T extends Number> BigDecimal transform(T v) {
if (v instanceof Double) {
return new BigDecimal(Double.toString((Double) v));
} else if (v instanceof Integer) {
return new BigDecimal(Integer.toString((Integer) v));
} else if (v instanceof Long) {
return new BigDecimal(Long.toString((Long) v));
} else if (v instanceof Short) {
return new BigDecimal(Short.toString((Short) v));
} else if (v instanceof Float) {
return new BigDecimal(Float.toString((Float) v));
} else {
return (BigDecimal) v;
}
}
BigDecimal方法
计算类型加减乘除四种,BigDecimal提供的方法也是围绕这四种计算类型设计的。
BigDecimal add(BigDecimal augend) //加
BigDecimal subtract(BigDecimal subtrahend) //减
BigDecimal multiply(BigDecimal multiplicand) //乘
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) //除
工具类在加减乘除基础上,提供了
- 链式计算,类似JDK8 lamada api,爽快丝滑的编程体验
- 支持集合求和、求平均
- 支持复合计算,例如2*(2+8)
BigDecimal精确计算工具类实用案例
精确转换为BigDecimal,不指定精度
System.out.println(PreciseCalculations.transform(121.11)); //转化double -> 121.11
System.out.println(PreciseCalculations.transform(Integer.MAX_VALUE)); //转化int -> 2147483647
System.out.println(PreciseCalculations.transform(Short.MAX_VALUE)); //转化Short -> 32767
System.out.println(PreciseCalculations.transform(Long.MAX_VALUE)); //转化long -> 9223372036854775807
System.out.println(PreciseCalculations.transform(121.19F)); //转化float -> 121.19
精确转换为BigDecimal,指定精度
System.out.println(PreciseCalculations.transform(121.1111111111, 5)); //精度大于指定精度 -> 121.11111
System.out.println(PreciseCalculations.transform(121.11, 5)); //精度小于指定精度,补零 -> 121.11000
加减乘除
System.out.println(PreciseCalculations.add(12.11, 12.11)); //加法 -> 24.22
System.out.println(PreciseCalculations.subtract(12.11, 12.11)); //减法 -> 0.00
System.out.println(PreciseCalculations.multiply(12.11, 12.11)); //乘法 -> 146.6521
System.out.println(PreciseCalculations.divide(12.11, 2.35, 5)); //除法 -> 5.15319
负数计算
// -1.11 * 13 - 90 = -104.43
System.out.println(new PreciseCalculation(-1.11).multiply(13).add(-90).getValue());
// -11.11111111 + 90 = 78.88888889
System.out.println(PreciseCalculations.add(-11.11111111,90));
集合 求和 求平均值
List<Double> list = Arrays.asList(12.11D, 13.11D, 14.11D, 15.321312D);
System.out.println(PreciseCalculations.sum(list)); //求和 -> Optional[54.651312]
System.out.println(PreciseCalculations.average(list)); //平均值 -> Optional[13.66283]
System.out.println(PreciseCalculations.average(Collections.emptyList())); //空集合 -> Optional.empty
复合计算
// 计算 121.11 * 13 / 60 + 100 - 12 = 114.24050
System.out.println(new PreciseCalculation(121.11).multiply(13).divide(60, 5).add(100).subtract(12).getValue());
//计算 121.11 * 128.59 / (100 + 12) - 100 = 39.04942
System.out.println(new PreciseCalculation(121.11).multiply(128.59).divide(
new PreciseCalculation(100).add(12), 5).subtract(100).getValue());
注意事项
- PreciseCalculation 核心类,提供加减乘除、集合精确计算方法,内部维护value值,每次计算该value都会改变。
- PreciseCalculations 基于上述的工具类,方便简单计算时使用。
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 ...
- 使用BigDecimal进行精确计算工具类
package com.develop.util; import java.math.BigDecimal; import java.math.RoundingMode; public class M ...
- 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的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法, ...
- BigDecimal精确计算及陷阱
BigDecimal通常在涉及到精确计算的时候会用到,下面是自己多次错误使用BigDecimal的总结. 结论: BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal( ...
- 精度更高的double类型计算工具类(借助BigDecimal类型)
/** * 提供精確的加法運算 * @param args */ public static double add(double v1, double v2) { BigDecimal b1 = ne ...
- 运用BigDecimal精确计算
package com.wzh.test; import java.math.BigDecimal; public class test { /** * @param args */ public s ...
随机推荐
- React 解析/ 第二节 使用 Reac
官方脚手架 create-react-app React 提供了一个官方的命令行工具(CLI)—— create-react-app,是专门用于快速搭建单页面应用(SPA)的脚手架,它基于 Webpa ...
- RoBERTa模型总结
RoBERTa模型总结 前言 RoBERTa是在论文<RoBERTa: A Robustly Optimized BERT Pretraining Approach>中被提出的.此方法 ...
- MySQL会话控制限制登录次数
前言 一般我们开发环境的MySQL是没有配置登录保护的,但仅限于开发环境,正式环境是不允许无限制登录,存在很大的风险. MySQL 5.7 以后提供了Connection-Contro ...
- IDEA | 识别不出自建webapp文件夹
背景: 今天自建了一个webapp文件夹,发现idea识别不出来是web应用的资源文件夹 解决方案 打开project structure配置,如下图
- SSH(二)
SSH框架整合的系统架构,Action.Service.Dao.SessionFactory.DataSource都可以作为Spring的Bean组件管理 使用HibernateDaoSupport基 ...
- 使用PyCharm创建并运行一个Python项目
(1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况, ...
- CCF_ 201512-2_消除类游戏
水平方向遍历一次,竖直方向遍历一次,将需要删除的位置标志入一个数组,最后比较输出即可. #include<cstdio> #include<iostream> using na ...
- Codeforces 1065C Make It Equal (差分+贪心)
题意:n个塔,第i个塔由$h_i$个cube组成,每次可以切去某高度h以上的最多k个cube,问你最少切多少次,可以让所有塔高度相等 k>=n, n<=2e5 思路:差分统计每个高度i有的 ...
- 在家想自学Java,有C语言底子,请问哪本书适合?
一.问题剖析 看到这个问题,我想吹水两句再做推荐.一般发出这个疑问都处在初学编程阶段,编程语言都是相通的,只要你领悟了一门语言的"任督二脉",以后你学哪一门语言都会轻易上手.学语言 ...
- 11--Java--JDBC知识梳理
JDBC 一.概述:JDBC(java database connection),使用java语言连接数据库,是java提供一套操作数据库的接口(标准),实现对数据库的统一访问,是一个java引用应用 ...