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. DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色

    本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用.本文属于入门级博客,期望本文能让大家了解 Vortic ...

  2. MySQL用户也可以是个角色

    前言 角色(Role),可以认为是一些权限的集合,一直是存在各个数据库中,比如Oracle.SQL Server.OceanBase等,MySQL 自从 8.0 release 才引入角色这个概念. ...

  3. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (树上差分+线段树合并)

    显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案. 用动态开点的方式建立线段树,注意离散化. 1 #include<bits/st ...

  4. git记不住用户名跟密码,每次提交拉取都需要再次输入

    问题:之前为了测试git提交的一个问题,选择不记住用户名跟密码,输入如下命令即可不记住 git credential-manager uninstall git update-git-for-wind ...

  5. 微信小程序专题(二)-----微信openid的获取

    一,简单来讲就是以下流程 通过get方式获取信息 在前端调用wx.login() 获取 临时登录凭证code之后,将code字符串发送给后端,后端通过auth.code2Session接口获取用户唯一 ...

  6. linux安装达梦数据库8

    PS.本次测试只是为了项目需要,但是在部署和启动程序的时候发生了一系列的报错,由此记录下来为日后作参考 安装达梦数据库 1. 达梦数据库(DM8)简介 达梦数据库管理系统是武汉达梦公司推出的具有完全自 ...

  7. 怎样在GitHub上建立仓库、以及怎样实现分支代码的合并。保姆级别的教程

    GitHub官网地址:https://github.com/ 注意:前提是已经注册了GitHub 文章目录 第一步:创建一个新的仓库 第二步.创建一个分支 第三步.编辑和发布更改的内容 第四步.拉取请 ...

  8. 人人都懂的HTML基础知识-HTML教程(1)

    01.HTML基础简介 HTML (HyperText Markup Language,超文本标记语言) 不是一门编程语言,而是一种用于定义内容结构的标记语言,用来描述网页内容,文件格式为.html. ...

  9. v-debounce-throttle是一个vue防抖节流指令

    v-debounce-throttle是一个vue防抖节流指令 简介 v-debounce-throttle是一个vue防抖节流指令,控制单一事件的触发频率.其核心是拦截组件元素的v-on绑定事件,采 ...

  10. Linux正则表达式与grep

    bash是什么 bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令 bash还能从文件中读取linxu命令,称之为脚本 bash支持通配符.管道.命令替换.条件判断等逻辑控制语句 ...