BigDecimal

在基本数据类型中对于浮点数的计算时会出现精度丢失的情况,这个时候我们采用BigDecimal类来解决精度丢失的问题。

public class Test{
public static void main(String[] args){
double a=1.0;
double b=0.9;
System.out.println(a-b);
}
}
0.09999999999999998//精度丢失

观察上面代码,我们发现原本应该等于0.1的值却变成了0.09999999999999998,这是因为double类型中存储的值是一个近似值,同样float类型亦是如此,也就是说a中存储的值是无限接近1.0而非真正的1.0,b中存储的值也是无限接近0.9的,所以当整个运算下来出现了精度丢失。

不同的行业领域对数字的精度要求不一样,比如银行对数字的要求非常严格,这也就导致在追求高精度的数值上我们不能使用基本类型的浮点数来运算。

Java中提供了BigDecimal类供我们对高精度数字进行运算。


BigDecimal

位置:java.math包中

作用:精确计算浮点数

创建方式:BigDecimal a=new BigDecimal("1.0"); //构造方法中一定要选用字符串带参构造,否则运算还是会丢失精度

方法:

方法名 功能
public BigDecimal add(BigDecimal b); +
public BigDecimal subtract(BigDecimal b); -
public BigDecimal multiply(BigDecimal b); *
public BigDecimal divide(BigDecimal b); /
public BigDecimal divide(BigDeclimal b, int scal, RoundingMode mode); scal—保留的位数;mode—舍入的模式;四舍五入为BigDecimal.ROUND_HALF_UP
public class Test{
public static void main(String[] args){
BigDecimal b1=new BigDecimal("1.0");//注意这里一定要用字符串的传参才能保证精度不丢失
BigDecimal b2=new BigDecimal("0.9"); //当BigDecimal实例后,我们不能对实例进行加减乘除,应该调用实例的方法进行运算
//subtract(); 减法
BigDecimal c1=b1.subtract(b2);
System.out.println(c1);
//multiply();乘法
System.out.println(b1.multiply(b2));
//add();加法
System.out.println(b1.add(b2));
//divide();除法
System.out.println(new BigDecimal("1.0").divide(new BigDecimal("2.0")));//链式运算
//除法中除不尽的情况下我们要用到divide的重载方法
System.out.println(new BigDecimal("1.0").divide(new BigDecimal("3.0"),2,BigDecimal.ROUND_HALF_UP) );
}
}
0.1
0.90
1.9
0.5
0.33 //保留两位小数且四舍五入

注意:

  • BigDecimal构造器使用字符串参数,否则精度丢失
  • BigDecimal实例化后不可再用普通运算符来操作对象的运算,需调用方法进行运算
  • 除法中有除不尽的情况,需要用到divide的重载方法

最新文章

  1. 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法
  2. QEMU 中的QOM分析
  3. 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击
  4. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
  5. 从零开始学Python08作业思路:开发简单的FTP
  6. MySQL 5.5安装记录
  7. Netty服务端与客户端(源码一)
  8. Machine Learning Done Wrong
  9. Oracle中的CR块详解
  10. hdu4177:Super Mario
  11. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
  12. Converting between IEEE 754 and Float (Format related
  13. JDBC与JNDI的区别
  14. 201521123021《Java程序设计》第1周学习总结
  15. .net 系列:并发编程之一 并发编程的初步理论
  16. QT之TCP通信
  17. 一个典型的kubernetes工作流程 - kubernetes
  18. 你可能不知道的jvm的类加载机制
  19. centos 桥接配置 设置网络代理 lnmp搭建
  20. 将pip源设置为国内源的方法

热门文章

  1. 引入Wukong让你的系统瞬间具备IOC能力
  2. day44-反射03
  3. P5658 [CSP-S2019] 括号树
  4. liunx之expect简介
  5. 华为交换机STP常用命令
  6. 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
  7. 齐博x1标签实例:标签的嵌套用法,调用聚合数据
  8. 九、kubernetes命令行工具kubectl
  9. 【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解
  10. ES6 学习笔记(十一)迭代器和生成器函数