BigDecimal基本加减乘除

embedded/2024/9/25 12:45:41/

一、BigDecimal类

在Java中,BigDecimal类提供了对超过16位有效位的数进行精确运算的能力。它不能直接使用传统的+、-、*、/等算术运算符,而是必须调用其相应的方法来进行运算。这些方法包括

加法:使用add()方法。
减法:使用subtract()方法。
乘法:使用multiply()方法。
除法:使用divide()方法,该方法允许设置精确度和舍入模式来控制计算结果的精度和舍入规则。

二、工具类

代码如下:

package com.common.utils;import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;/*** BigDecimal工具类*/
public class BigDecimalUtils {private static final BigDecimal hundred = new BigDecimal(100);private static final BigDecimal thousand = new BigDecimal(10000);/*** 转换String保留2位*/public static String genTransString(BigDecimal num) {if (num == null) {num = BigDecimal.ZERO;} else {num = num.setScale(2,BigDecimal.ROUND_HALF_UP);}return num.stripTrailingZeros().toPlainString();}/*** 转换为亿元保留2位,返回String*/public static String genMillon(BigDecimal num) {if (num == null) {num = BigDecimal.ZERO;} else {num = num.divide(thousand,2,BigDecimal.ROUND_HALF_UP);}return num.stripTrailingZeros().toPlainString();}/*** 相除,转换为亿元保留2位,返回String*/public static String genMillonTwo(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}if (compare(num2)) {return BigDecimal.ZERO.toPlainString();} else {num1 = num1.divide(thousand,4,BigDecimal.ROUND_HALF_UP);num2 = num2.divide(thousand,4,BigDecimal.ROUND_HALF_UP);return num1.divide(num2,2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString();}}/*** String类型的万元转换为亿元* @return*/public static String genMillonString(String num) {BigDecimal bd;if (ObjectUtils.isNotEmpty(num)) {bd = new BigDecimal(num);} else {bd = BigDecimal.ZERO;}return bd.divide(thousand,2,BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString();}/*** 相加之和,且四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genAddNum(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}return num1.add(num2).setScale(2,BigDecimal.ROUND_HALF_UP);}/*** 相减之差,且四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genSubtractNum(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}return num1.subtract(num2).setScale(2,BigDecimal.ROUND_HALF_UP);}/*** 相乘之积,且四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genMultiplyNum(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}if (compare(num2)) {return BigDecimal.ZERO;} else {return num1.multiply(num2).setScale(2,BigDecimal.ROUND_HALF_UP);}}/*** int类型数相乘,且四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genIntMultiplyNum(Integer num1, Integer num2) {if (num1 == null) {num1 = 0;}if (num2 == null) {num2 = 0;}if (num2.intValue() == 0) {return BigDecimal.ZERO;} else {return new BigDecimal(num1).multiply(new BigDecimal(num2)).setScale(2,BigDecimal.ROUND_HALF_UP);}}/*** 两数相除,且四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genDivideNum(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}if (compare(num2)) {return BigDecimal.ZERO;} else {return num1.divide(num2,4,BigDecimal.ROUND_HALF_UP);}}/*** 两数相除,且乘100,四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genBigDecimalNum(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}if (compare(num2)) {return BigDecimal.ZERO;} else {return num1.divide(num2,4,BigDecimal.ROUND_HALF_UP).multiply(hundred).setScale(2,BigDecimal.ROUND_HALF_UP);}}/*** 两个int类型数相除,且乘100,四舍五入,保留两位小数,最后转为String类型* @param num1* @param num2* @return*/public static String genIntToStringNum(Integer num1, Integer num2) {if (num1 == null) {num1 = 0;}if (num2 == null) {num2 = 0;}if (num2.intValue() == 0) {return BigDecimal.ZERO.toPlainString();} else {return new BigDecimal(num1).divide(new BigDecimal(num2),4,BigDecimal.ROUND_HALF_UP).multiply(hundred).setScale(2,BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString();}}/*** 两个int类型数相除,且乘100,四舍五入,保留两位小数* @param num1* @param num2* @return*/public static BigDecimal genIntToBigDecimalNum(Integer num1, Integer num2) {if (num1 == null) {num1 = 0;}if (num2 == null) {num2 = 0;}if (num2.intValue() == 0) {return BigDecimal.ZERO;} else {return new BigDecimal(num1).divide(new BigDecimal(num2),4,BigDecimal.ROUND_HALF_UP).multiply(hundred).setScale(2,BigDecimal.ROUND_HALF_UP);}}/*** 与0相比较,是否相等* @param num* @return*/public static Boolean compare(BigDecimal num) {if (num.compareTo(BigDecimal.ZERO) == 0 ) {return true;} else {return false;}}}

http://www.ppmy.cn/embedded/44176.html

相关文章

芋道源码 / yudao-cloud:前端技术架构探索与实践

摘要: 随着企业信息化建设的深入,后台管理系统在企业运营中扮演着至关重要的角色。本文将以芋道源码的yudao-cloud项目为例,深入探讨其前端技术架构的设计思路、关键技术与实现细节,并分享在开发过程中遇到的挑战与解决方案。 一、…

c++中的继承

一、引言 在面向对象编程(OOP)的世界中,继承是一个核心概念,它允许我们定义一个类(称为基类或父类)作为另一个类(称为派生类或子类)的基础。通过继承,子类可以继承基类的…

【JS基础知识06】数组

一:数组是什么以及如何创建 1 是什么 数组是一种引用数据类型(复杂数据类型),在数组中可以添加任何数据类型的元素 2 怎么创建 利用数组字面量的方式 let arr [数组元素] 利用new构造函数方式 let arr new Array(数组元素)…

前端面试题日常练-day40 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 1. Bootstrap 的栅格系统是基于( )进行布局的。A. 像素 B. 百分比 C. 媒体查询 2. 在 Bootstrap 中,要创建一个按钮,可以使用( &#xff…

深度学习之学习率调度器Scheduler介绍

调度器是深度学习训练过程中非常重要的一部分,它用于动态调整模型的学习率,从而提高训练效率和最终性能。 1. 为什么需要学习率调度器? 深度学习训练中,学习率是一个非常关键的超参数。合适的学习率可以确保模型快速收敛并获得良好的性能。 但是在训练过程中,最优的学习率会随…

MindSpore实践图神经网络之环境篇

MindSpore在Windows11系统下的环境配置。 MindSpore环境配置大概分为三步:(1)安装Python环境,(2)安装MindSpore,(3)验证是否成功 如果是GPU环境还需安装CUDA等环境&…

ABAP 在增强中COMMIT

前言 呃,又是很磨人的需求,正常情况下是不允许在增强中COMMIT的,会影响源程序本身的逻辑,但是这个需求就得这么干… 就是在交货单增强里面要再调用一次交货单BAPI,通过SO的交货单自动创建STO的交货单,如果…

Mysql联合索引

对mysql联合索引的认识 文章目录 对mysql联合索引的认识最左原则匹配一、最左匹配的原理?二、实战 最左原则匹配 所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配&#xff…