JavaSE-30 BigDecimal类的使用
问题
Java(其他编程语言也存在类似问题)中浮点数直接进行算术运算会导致精度丢失。
示例代码:
System.out.println("1.0 - 0.9 =" + (1.0 - 0.9));
System.out.println("0.1 + 0.02 =" + (0.1 + 0.02));
System.out.println("1.013 * 100 =" + (1.013 * 100));
System.out.println("123.3 / 100 =" + (123.3 / 100));
运行结果为:
解决方案
Java提供了BigDecimal类用来解决浮点数的运算。
BigDecimal提供了大量的构造方法用于生成一个BigDecimal对象,包括把基本类型、数字字符串、数字数组构造成BigDecimal对象。
这里以double类型数字转换为BigDecimal对象进行说明。常用有三种方式将double类型数字转换为BigDecimal对象。
- BigDecimal(double value):不推荐使用。生成的数值和value是一个近似数,不精确。
- BigDecimal(String value):推荐使用。
- BigDecimal.valueOf(double value):推荐使用。可以直接把一个double类型数值转换为精确的BigDecimal对象。
BigDecimal类型提供了相应方法实现算术运算,常用方法如下表所示,具体参数可以查询API文档。
方法 | 方法说明 |
add() | 相加 |
subtract() | 相减 |
multiply() | 相乘 |
devide() | 相除 |
pow() | 幂运算 |
示例代码:
BigDecimal num1 = new BigDecimal("0.05");
BigDecimal num2 = new BigDecimal("0.01");
System.out.println("0.05 + 0.01 =" + (num1.add(num2)));
System.out.println("0.05 - 0.01 =" + (num1.subtract(num2)));
System.out.println("0.05 * 0.01 =" + (num1.multiply(num2)));
System.out.println("0.05 / 0.01 =" + (num1.divide(num2)));
运行结果:
自定义浮点数计算类
项目中如果要频繁进行浮点数计算,可以自定义一个浮点数计算类。
在进行除法运算过程中,如果需要进行精度控制,可以使用divide(BigDecimal divisor, int scale, int roundingMode)方法进行精度控制。sacale表示精度,roundingMode表示舍入方式。
示例代码:
public class MyArith {
/** 定义除法运算精度 */
private static final int DEFAULT_DIV_SCALE = 10; /** 单例模式 */
private MyArith() {
} /** 精确加法运算 */
public static double add(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.add(b2).doubleValue();
} /** 精确加法运算 */
public static double sub(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.subtract(b2).doubleValue();
} /** 精确乘法运算 */
public static double mul(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
return b1.multiply(b2).doubleValue();
} /** 精确除法运算 */
public static double div(double value1, double value2) {
BigDecimal b1 = BigDecimal.valueOf(value1);
BigDecimal b2 = BigDecimal.valueOf(value2);
// 精确到小数点后10位,四舍五入
return b1.divide(b2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
} /** 测试方法 */
public static void main(String[] args) {
System.out.println("0.05 + 0.01 = " + MyArith.add(0.05, 0.01));
System.out.println("1.0 + 0.42 = " + MyArith.sub(1.0, 0.42));
System.out.println("4.015 * 100 = " + MyArith.mul(4.015, 100));
System.out.println("123.3 / 99 = " + MyArith.div(123.3, 99)); }
}
运行结果:
JavaSE-30 BigDecimal类的使用的更多相关文章
- BIgInteger类和BigDecimal类的理解
第一部分: 这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; Bi ...
- Java学习——BigInteger类和BigDecimal类
Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...
- Java匹马行天下之JavaSE核心技术——工具类
Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...
- JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类
常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...
- BigDecimal类
如果需要精确的计算结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. //========================================== ...
- Java大数处理类:BigInteger类和BigDecimal类
当我们要处理非常大的数据时,平常用的数据类型已不足以表示,在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类在理论上只要计算机内存足够大就能够表示无线 ...
- Java API —— BigDecimal类
1.BigDecimal类概述 由于在运算的时候,float类型和double很容易丢失精度,演示案例.所以,为了能精确的表示.计算浮点数,Java提供了BigDecimal 不可变的.任意精度的有 ...
- 用BigDecimal类实现Fibonacci算法
Fibonacci(N)=Fibonacii(N-1)+Fibonacci(N-2) 其中 Fibonacci(0)=0;Fibonacci(1)=1 用循环或则递归实现Fibonacci算法很简单, ...
- java.math.BigDecimal类
BigDecimal类用于高精度计算.一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecima ...
- Java基础知识强化88:BigDecimal类之BigDecimal类引入和概述 以及 BigDecimal的使用(加减乘除)
1. BigDecimal类概述: 由于在运算的时候,float类型和double很容易丢失精度.所以为了能够精确的表达.计算浮点数,Java提供了BigDecimal. BigDecimal:不可变 ...
随机推荐
- Vue scrollBehavior 滚动行为
使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动. 注意: 这个功能只 ...
- Spring Boot与Spring Session集成
1. 参考资料 https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html ht ...
- 2.25-2.26 MapReduce执行流程Shuffle讲解
原文链接:https://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是 ...
- ubuntu下安装vmtool
这是我遇到这个问题的解决办法-------无法通过vmware的设置安装vmtoll 1.关闭虚拟机2.编辑虚拟机,将CD/DVD选项改成自动检测(而不是之前指向的ubuntuxxx.iso)3.重启 ...
- UVa 1644 Prime Gap (水题,暴力)
题意:给定一个数 n,求它后一个素数和前一个素数差. 析:先打表,再二分查找. 代码如下: #pragma comment(linker, "/STACK:1024000000,102400 ...
- liteos 中断机制(四)
1. 概述 中断是指出现需要时, CPU暂停执行当前程序,转而执行新程序的过程.即在程序运行过程中,系统出现了一个必须由CPU立即处理的事务,此时, CPU暂时中止当前程序的执行转而处理这个事务,这个 ...
- hdoj5328【尺取】
现在在队内赛(灰常艾斯比的队内赛),还是来写篇题解开心一下,23333. 题意: 就是问你找出一个最长的等比数列或者等差数列 思路: 一个等差的尺取,一个等比的尺取.2333,就这么过了,具体自己写吧 ...
- bzoj 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁【生成函数||dp】
用生成函数套路推一推,推完老想NTT--实际上把这个多项式乘法看成dp然后前缀和优化一下即可 #include<iostream> #include<cstdio> using ...
- IT兄弟连 JavaWeb教程 请求重定向案例
Check2Servlet类与Output2Servlet类之间为请求转发关系.在web.xml文件中,为Check2Servlet映射的URL为"/check2",为Output ...
- 7天学完Java基础之3/7
API概述 什么叫做API? API(Application Programming lnterface),应用程序编程接口. 所谓API就是值好多的类,好多的方法,JDK给我们提供了很多现成的类,我 ...