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的重载方法

Day34:BigDecimal的使用的更多相关文章

  1. BigDecimal 详细解析

    参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double, 而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal, 而在业务中常常有关B ...

  2. Java BigDecimal 转换,除法陷阱(转)

    源地址:   http://blog.csdn.net/niannian_315/article/details/24354251 今天在用BigDecimal“出现费解”现象,以前虽然知道要避免用, ...

  3. JAVA BigDecimal 小数点处理

    1,保留两位小数 方法一:{ double c=3.154215; java.text.DecimalFormat myformat=new java.text.DecimalFormat(" ...

  4. BigDecimal 处理集合

    1  创建一个BigDecimal 对象 BigDecimal Sum = new BigDecimal(0); 2  一个BigDecimal 对象,保留2位小数点 Sum.setScale(2,B ...

  5. BigDecimal用法详解

    一.简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...

  6. java 大数据处理类 BigDecimal 解析

    这两天,由于我的必修课概率论里经常要用到排列组合的计算,感觉很麻烦,加上现代智能手机的计算器是没有这方面功能的. 所以,就自己动手写了个安卓的 排列组合 计算器,用了一天,发现有很大的问题,阶乘达百亿 ...

  7. BigDecimal 加减乘除

    BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5&quo ...

  8. 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法

    1. BigDecimal 类型数据 的创建,构造函数 有 public BigDecimal(BigInteger intVal, long val, int scale, int prec); p ...

  9. jdbctemplate中的批量更新使用,BigDecimal与造型的联系和区别

    //jdbctemplate批量新增的使用MENU_ID_LIST是前端页面传递到后端控制层,再由控制层传到实现层的List //JdbcTemplate是spring jdbctemplate通过注 ...

  10. 使用BigDecimal进行精确运算以及格式化输出数字

    一.引言    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...

随机推荐

  1. Traefik SRE 之使用 Prometheus 进行监控报警

    当我们使用 Traefik 作为 Kubernetes 的 Ingress 控制器的时候,我们自然也非常有必要对其进行监控.本文我们将探讨如何使用 Prometheus 和 Grafana 从 Tra ...

  2. 获取Docker容器名称和ID

    docker ps --format "{{.Names}}" docker ps -q

  3. Elastic:用 Docker 部署 Elastic Stack

    文章转载自:https://elasticstack.blog.csdn.net/article/details/100919273 前提条件 首选需要在主机上安装好docker和docker-com ...

  4. 14. Fluentd输出插件:out_forward用法详解

    out_forward是一个带缓存的输出插件,用于向其他节点转发日志事件,并支持转发节点之间的负载均衡和自动故障切换. out_forward支持至多一次和至少一次传输模式,默认为至多一次. out_ ...

  5. 【前端必会】让ESLint与Prettier一起玩耍

    背景 上回说到ESlint和Prettier可能会有规则上的冲突,解决的办法有多种,好比不用Prettier 不用Prettier也是一种选择 配置相同的规则 我们选择一种可以共存的方式 可以参考这篇 ...

  6. 前端三件套 HTML+CSS+JS基础知识内容笔记

    HTML基础 目录 HTML基础 HTML5标签 doctype 标签 html标签 head标签 meta标签 title标签 body标签 文本和超链接标签 标题标签 段落标签 换行标签 水平标签 ...

  7. WPF开发经验-WPF的TextBox控件的MouseDown事件不响应的解决方法

    一 问题的发现 最近项目有个需求,大概是,当点击某个TextBox时,先执行一些业务上的逻辑处理. 于是按以往思维,将TextBox的MouseDown事件关联事件处理方法,将业务处理写在方法里. 调 ...

  8. 数据结构与算法【Java】08---树结构的实际应用

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  9. PHP全栈开发(八):CSS Ⅸ dispaly & visibility

    display用来设置一个元素如何显示: visibility用来设置一个元素可见还是隐藏. visibility:hidden: 这个语句会使元素在HTML页面中不可见.但是这个元素仍然会占用HTM ...

  10. Azure Kubernetes(AKS)部署及查看应用资源

    简介 上一篇文章讲解了如何使用Azure DevOps持续部署应用到Azure Kubernetes上.但是部署是否成功?会不会遇到什么问题?项目运行中是否会出现问题?我们该怎么样查看这些问题,并且对 ...