【Java】使用BigDecimal类进行精确小数计算
2023-09-11 14:22:25 时间
在商业计算中(尤其是计算价格)需要使用BigDecimal类来进行精确小数计算,因为用其他类型计算(如double)得到的结果不是精确的!
写个测试类。
import org.junit.Test; import java.math.BigDecimal; public class BigDecimalTest { @Test public void test1(){ System.out.println(0.05 + 0.01); // 0.060000000000000005 System.out.println(1 - 0.42); // 0.5800000000000001 System.out.println(4.015 * 100); // 401.49999999999994 System.out.println(123.3 / 100); // 1.2329999999999999 } @Test public void test2(){ BigDecimal b1 = new BigDecimal(0.05); BigDecimal b2 = new BigDecimal(0.01); System.out.println(b1.add(b2)); // 0.06000000000000000298372437868010820238851010799407958984375 } @Test public void test3(){ BigDecimal b1 = new BigDecimal("0.05"); BigDecimal b2 = new BigDecimal("0.01"); System.out.println(b1.add(b2)); // 0.06 } }
小结一:关于BigDecimal类的使用方法。
- System.out.println()中的数字默认是double类型的,double类型小数计算不精准。
- 使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。
- 实际项目中,数据库存的通常是float或double类型,所以计算时需要频繁进行转换,通常需要单独封装一个转换方法。
封装一个工具类BigDecimalUtil.java
import java.math.BigDecimal; public class BigDecimalUtil { // 私有构造方法,防止外部new private BigDecimalUtil(){} // 加法。 public static BigDecimal add(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2); } // 减法。 public static BigDecimal sub(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2); } // 乘法。 public static BigDecimal mul(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2); } // 除法。 public static BigDecimal div(double v1, double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP); // 四舍五入,保留2位小数 } }
小结二:关于JUnit单元测试的使用方法。
- 新建一个类做单元测试,通常在目录“项目名/src/test/java/”下。
- 编写测试方法,标注上@Test,即可右键运行该测试方法,而不需要写主函数调用。
相关文章
- [Java基础] java的守护线程与非守护线程
- Java实现 蓝桥杯 算法提高 计算行列式
- java实现第四届蓝桥杯快速排序
- java 中的 instanceof
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- 【JAVA】基于MVC架构Java技术荟萃案例演练
- 【Java面试题】计算一个数字的立方根,不使用库函数
- Java计算两点间经纬度距离(两种方式)
- Java 密钥库 证书 公钥 私钥
- 【java】Java连接mysql数据库及mysql驱动jar包下载和使用
- Java 关于java.util.LinkedHashMap cannot be cast to 实体类问题答案
- 【华为OD机试 2023】 计算快递主站点(C++ Java JavaScript Python)
- JAVA编程:java环境安装和helloworld
- 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略
- Java资源大全中文版(Awesome最新版)
- JAVA学习第十九课(java程序的异常处理 (二))
- 从一开始,说出事java匿名内部类
- JAVA语言之Java 中不同的并行实现的性能比较
- 转换基于Maven的Java项目支持Eclipse IDE
- 【java】Java 集合框架