BigDecimal 类的使用
BigDecimal 类的使用
1、使用 BigDecimal 的原因
由于需要计算金额,所有需要高精度计算,所有需要使用 BigDecimal 类。
BigDecimal能够精确的表示一个小数,常用于商业和科学计算;float,double不能精确的表示一个小数。
2、常用方法
2.1 加法(add)
分别用两种不同的数据类型(long 和 string)创建 BigDecimal 对象;
import java.math.BigDecimal;
public class BigDecimalTest {
/**
* 使用BigDecimal,参数类型是double类型,计算还是不精确
*/
@Test
public void testAdd1(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.add(b2));
//输出:0.06000000000000000298372437868010820238851010799407958984375
}
/**
* 使用BigDecimal,参数类型是String类型,计算结果精确
*/
@Test
public void testAdd2(){
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.add(b2));
//输出:0.06
}
}
从上面的结果可以看出使用 string 类型的才能得到精确的计算结果。所有在计算金额时注意使用 string 类型创建对象。
2.2 减法(subtract)
import java.math.BigDecimal;
public class BigDecimalTest {
/**
* 测试减法 参数类型是double类型,计算还是不精确
*/
@Test
public void testSubtract1(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.subtract(b2));
//输出:0.04000000000000000256739074444567449972964823246002197265625
}
/**
* 测试减法,参数类型是String类型,计算结果精确
*/
@Test
public void testSubtract2(){
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.subtract(b2));
//输出:0.04
}
}
2.3 乘法(multiply)
import java.math.BigDecimal;
public class BigDecimalTest {
/**
* 测试乘法 参数类型是double类型,计算还是不精确
*/
@Test
public void testMultiply1(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.multiply(b2));
//输出:0.0005000000000000000381639164714897566548413219067927041589808827754781955614304944646164585719816386699676513671875
}
/**
* 测试乘法,参数类型是String类型,计算结果精确
*/
@Test
public void testMultiply2(){
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.multiply(b2));
//输出:0.0005
}
}
2.4 除法(divide)
2.4.1 除不尽,报错
由于10/3除不尽,商是无限小数,所以报错;
Non-terminating decimal expansion; no exact representable decimal result.
import java.math.BigDecimal;
public class BigDecimalTest {
/**
* 测试除法 参数类型是double类型
*/
@Test
public void testDivide1(){
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.03);
System.out.println(b1.divide(b2));
//报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
}
/**
* 测试除法,参数类型是String类型
*/
@Test
public void testDivide2(){
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.03");
System.out.println(b1.divide(b2));
//报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
}
}
2.4.2 解决办法
其实devide的函数定义如下:
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode);
- scale为小数位数;
- roundingMode为小数模式;
小数模型有以下类型:
- ROUND_CEILING
如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。 - ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。 - ROUND_FLOOR
如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。 - ROUND_HALF_DOWN
若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。 - ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。 - ROUND_HALF_UP
若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。 - ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。 - ROUND_UP
总是在非 0 舍弃小数(即截断)之前增加数字。
所有除法应该写成以下形式;
BigDecimal num3 = num1.divide(num2,10,ROUND_HALF_DOWN);
import java.math.BigDecimal;
public class BigDecimalTest {
/**
* 测试除法 参数类型是double类型
*/
@Test
public void testDivide3(){
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.03);
System.out.println(b1.divide(b2, 10, ROUND_HALF_DOWN));
//输出:3.3333333333
}
/**
* 测试除法,参数类型是String类型
*/
@Test
public void testDivide4(){
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.03");
System.out.println(b1.divide(b2, 10, ROUND_HALF_DOWN));
//输出:3.3333333333
}
3、小结
- 使用 string 类型创建 BigDecimal 对象来进行精确计算;
- 进行除法计算时,需要添加参数(scale)小数位数和(roundingMode)小数模式;避免出现除不尽报错的现象;
BigDecimal 类的使用的更多相关文章
- BigDecimal类
如果需要精确的计算结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作. //========================================== ...
- Java大数处理类:BigInteger类和BigDecimal类
当我们要处理非常大的数据时,平常用的数据类型已不足以表示,在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类在理论上只要计算机内存足够大就能够表示无线 ...
- BIgInteger类和BigDecimal类的理解
第一部分: 这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; Bi ...
- 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:不可变 ...
- BigDecimal类对象的使用详解
双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行 ...
- BigDecimal类的简单使用方法
一提到Java里面的商业计算,我们都知道不能用float和double,由于他们无法进行精确计算.可是Java的设计者给编程人员提供了一个非常实用的类BigDecimal,他能够完好float和dou ...
- 金额的计算BigDecimal类
金额的计算BigDecimal类 double d = 9.84; double d2 = 1.22; //注意需要使用BigDecimal(String val)构造方法 BigDecimal bi ...
随机推荐
- 学习笔记|JSP教程|菜鸟教程
学习笔记|JSP教程|菜鸟教程 ------------------------------------------------------------------------------------ ...
- docker设置引用国内镜像加速
设置步骤: 1 先到daocloud.io网站注册一个账号 过程略,注册成功后,进入控制台 2 点击控制台上的加速器 拉到中间部分,有一个『主机监控程序』的文字链接,见下图: 然后选择主机类型,我用的 ...
- [Swift实际操作]七、常见概念-(12)使用DispatchGroup(调度组)管理线程数组
本文将为你演示调度组的使用,使用调度组可以将多个线程中的人物进行组合管理,可以设置当多个相同层次的任务完成之后,再执行另一项任务. 首先导入需要使用的界面工具框架 import UIKit 在控制台输 ...
- GPS坐标转百度地图坐标
百度地图提供了相关API:BMap.Convertor.translate, 但是使用上存在部分限制:1.次数限制:2.异步回调 可以用如下方法: /** * 地图位置计算工具(将GPS坐标转换成百度 ...
- Working with Metal—Overview
看完这个 WWDC 之后的总结. Metal 可以在单位时间内提供 10 倍的 draw call 调用. Background About Draw Call 每一次 draw call 调用都必须 ...
- Dota2APP--第二天
一.今天的任务 1)自定义标签栏控制器 2)自定义导航栏控制器 3)在新特性界面播放音频 1.第一个任务:自定义标签栏控制器 原因:默认的TabbarViewController不能满足项目的需求. ...
- Visual Studio性能计数器,负载测试结果分析- Part III
对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...
- 往word中插入美观的代码
http://www.planetb.ca/syntax-highlight-word 选择需要的语言,然后Show Highlighted,复制跳转页面显示的代码至word即可
- mariadb(mysql)的安装
1 使用官方源安装mariadb vim /etc/yum.repos.d/MariaDB.repo 添加repo仓库配置内容 [mariadb] name=MariaDB baseurl=http: ...
- win10 下springcloud打包docker镜像部署。
1:建一个最简单的springcloud应用. 2:在根目录下新建dockerfile,文件如下: FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE ...