前言

在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用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) //除

工具类在加减乘除基础上,提供了

  1. 链式计算,类似JDK8 lamada api,爽快丝滑的编程体验
  2. 支持集合求和、求平均
  3. 支持复合计算,例如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精确计算工具类的更多相关文章

  1. java精确计算工具类

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

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

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

  3. 使用BigDecimal进行精确计算工具类

    package com.develop.util; import java.math.BigDecimal; import java.math.RoundingMode; public class M ...

  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的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法, ...

  7. BigDecimal精确计算及陷阱

    BigDecimal通常在涉及到精确计算的时候会用到,下面是自己多次错误使用BigDecimal的总结. 结论: BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal( ...

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

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

  9. 运用BigDecimal精确计算

    package com.wzh.test; import java.math.BigDecimal; public class test { /** * @param args */ public s ...

随机推荐

  1. 腾讯云ubuntu服务器无法以root身份ssh连接

    在腾讯云上拿到的Ubuntu主机分配给的用户是ubuntu用户,并不是root用户,而阿里云上拿到的Ubuntu主机分配给的用户就是root用户.如果没有root用户权限做事情会变得麻烦,每次做什么都 ...

  2. [C语言学习笔记一]基本构架和变量

    基本构架 所有的C程序都有一个 main 函数.其后包含在大括号中的是 main 函数的内容. main函数是程序的入口,程序运行后,先进入 main 函数,然后一次执行 main 函数体中的语句. ...

  3. flask插件全家桶集成学习---持续更新ing

    不得不说flask的设计要比django要小巧精妙的多了,没有那么臃肿,只保留核心功能,其他的都需要自己引入,即各种各样的插件来满足我们的需求,我这里记录一下自己学习项目中用的插件使用方法和一些技巧总 ...

  4. .net core 认证与授权(二)

    前言 这篇紧接着一来写的,在第一篇中介绍了认证与授权,同时提出了这套机制其实就是模拟现实中的认证与授权. 同样这篇介绍在这套机制下,用户信息管理机制?这里就会问了,上一篇中认证和授权不是都ok了吗,怎 ...

  5. 在VMware中如何清理多余的空间

    问题描述 平时用的编程计算机只有250G空间,c盘和d盘,今天准备做实验,发现删除虚拟机中系统的内容不但没有减少空间,反而增加了,这时我意识到虚拟机内部可能与咱们想象的操作模式不一样. 解决办法 我的 ...

  6. 学习Qt的资源-网站、论坛、博客等

    来自<零基础学Qt 4编程>一书的附录 附录C Qt资源 C.1 Qt 官方资源 全球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程 ...

  7. C语言学习笔记--关于指针的一些小认知

    int main() { int i; char *str = "hu mian yuan"; int length = strlen(str); printf("str ...

  8. Actix-web Rust连接Postgres数据库

    Actix-web Rust连接Postgres数据库 ​ Rust1.39支持了异步async,await,Actix-web在2.0.0-alpha支持了原生异步写法,所以本文中使用的Actix- ...

  9. spring mvc框架入门

    目录 1.web框架分层 2.什么是springmvc 3.springmvc的优势 4.springmvc和struct的区别 (spring mvc框架入门 1.web框架分层 一般web框架可以 ...

  10. Codeforces 1188B Count Pairs (同余+分离变量)

    题意: 给一个3e5的数组,求(i,j)对数,使得$(a_i+a_j)(a_i^2+a_j^2)\equiv k\ mod\ p$ 思路: 化简$(a_i^4-a_j^4)\equiv k(a_i-a ...