Day34:BigDecimal的使用
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的使用的更多相关文章
- BigDecimal 详细解析
参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double, 而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal, 而在业务中常常有关B ...
- Java BigDecimal 转换,除法陷阱(转)
源地址: http://blog.csdn.net/niannian_315/article/details/24354251 今天在用BigDecimal“出现费解”现象,以前虽然知道要避免用, ...
- JAVA BigDecimal 小数点处理
1,保留两位小数 方法一:{ double c=3.154215; java.text.DecimalFormat myformat=new java.text.DecimalFormat(" ...
- BigDecimal 处理集合
1 创建一个BigDecimal 对象 BigDecimal Sum = new BigDecimal(0); 2 一个BigDecimal 对象,保留2位小数点 Sum.setScale(2,B ...
- BigDecimal用法详解
一.简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- java 大数据处理类 BigDecimal 解析
这两天,由于我的必修课概率论里经常要用到排列组合的计算,感觉很麻烦,加上现代智能手机的计算器是没有这方面功能的. 所以,就自己动手写了个安卓的 排列组合 计算器,用了一天,发现有很大的问题,阶乘达百亿 ...
- BigDecimal 加减乘除
BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5&quo ...
- 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法
1. BigDecimal 类型数据 的创建,构造函数 有 public BigDecimal(BigInteger intVal, long val, int scale, int prec); p ...
- jdbctemplate中的批量更新使用,BigDecimal与造型的联系和区别
//jdbctemplate批量新增的使用MENU_ID_LIST是前端页面传递到后端控制层,再由控制层传到实现层的List //JdbcTemplate是spring jdbctemplate通过注 ...
- 使用BigDecimal进行精确运算以及格式化输出数字
一.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...
随机推荐
- U盘插入电脑后图标是灰色的,打开提示“请将磁盘插入驱动器”
问题描述: U盘插到win10电脑上后,U盘图标显示灰色,双击打开提示:请将磁盘插入驱动器,无法格式化,在U盘点右键/属性,显示为容量等为0. 解决办法如下: 1.首先要下载一个U盘芯片检测工具chi ...
- 仿B站小火箭发射上升
效果图: CSS代码块: <style type="text/css"> .goTop { background-image: url(img/rocket_top ...
- 2022.9.17 Java第二次课总结
以下是本节课后的问题 首先是关于静态变量 在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个 ...
- C++面向对象编程之堆、栈和内存形式
1.stack 是存在与某个作用域的一块内存空间,当调用函数时,函数就会形成一个stack 存这它的一些参数.返回地址等,生闷气在函数执行完会自动消灭: 2.heap 是操作系统提供的全局的内存空间, ...
- 洛谷P2865 [USACO06NOV]Roadblocks G(次短路)
一个次短路的问题,可以套用dijkstra求最短路的方法,用dis[0][i]表示最短路:dis[1][i]表示次短路,优先队列中存有最短路和次短路,然后每次找到一条道路对他进行判断,更新最短或次短路 ...
- C++ 栈和典型迷宫问题
C++ 栈和迷宫问题 1. 前言 栈是一种受限的数据结构,要求在存储数据时遵循先进后出(Last In First Out)的原则.可以把栈看成只有一个口子的桶子,进和出都是走的这个口子(也称为栈顶) ...
- Docker容器技术基础
Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...
- 基于tauri+vue3.x多开窗口|Tauri创建多窗体实践
最近一种在捣鼓 Tauri 集成 Vue3 技术开发桌面端应用实践,tauri 实现创建多窗口,窗口之间通讯功能. 开始正文之前,先来了解下 tauri 结合 vue3.js 快速创建项目. taur ...
- 创建第一个springboot项目、用springboot实现页面跳转、@Controller和@RestController的区别
文章目录 一.第一个spring boot项目 二.spring boot跳转到指定页面 三.怎样将后台的信息传递到前台 四. @Controller和@RestController的区别? 一.第一 ...
- .net core -利用 BsonDocumentProjectionDefinition 和Lookup 进行 join 关联 MongoDB 查询
前序 前段时间由于项目需要用到MongoDB,但是MongoDB不建议Collection join 查询,网上很多例子查询都是基于linq 进行关联查询.但是在stackoverflow找到一个例 ...