博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BigDecimal
阅读量:5293 次
发布时间:2019-06-14

本文共 1997 字,大约阅读时间需要 6 分钟。

BigDecimal

概念

BigDecimal = 大的小数。用于表示精确的小数,常用于财务计算。

BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。

基础

BigDecimal bd = new BigDecimal"123.4567");

BigDecimal用scale()表示小数位数,例如:

BigDecimal d1 = new BigDecimal("123.45");BigDecimal d2 = new BigDecimal("123.4500");BigDecimal d3 = new BigDecimal("1234500");System.out.println(d1.scale()); // 2,两位小数System.out.println(d2.scale()); // 4System.out.println(d3.scale()); // 0

stripTrailingZeros()方法,去掉末尾的0

BigDecimal d1 = new BigDecimal("123.4500");BigDecimal d2 = d1.stripTrailingZeros();System.out.println(d1.scale()); // 4System.out.println(d2.scale()); // 2,因为去掉了00

四舍五入方法

public class Main {    public static void main(String[] args) {        BigDecimal d1 = new BigDecimal("123.456789");        BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入,123.4568        BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN); // 直接截断,123.4567        System.out.println(d2);        System.out.println(d3);    }}

对BigDecimal做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断:

BigDecimal d1 = new BigDecimal("123.456");BigDecimal d2 = new BigDecimal("23.456789");BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); // 保留10位小数并四舍五入

使用equals()方法比较两个BigDecimal的值是否相等时,要特别注意,不但要求两个BigDecimal的值相等,还要求它们的scale()相等:

BigDecimal d1 = new BigDecimal("123.456");BigDecimal d2 = new BigDecimal("123.45600");System.out.println(d1.equals(d2)); // false,因为scale不同System.out.println(d1.equals(d2.stripTrailingZeros())); // true,因为d2去除尾部0后scale变为2System.out.println(d1.compareTo(d2)); // 0

必须使用compareTo()方法来比较,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。

总是使用compareTo()比较两个BigDecimal的值,不要使用equals()!

如果查看BigDecimal的源码,可以发现,实际上一个BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数:

public class BigDecimal extends Number implements Comparable
{ private final BigInteger intVal; private final int scale;}

小结

BigDecimal用于表示精确的小数,常用于财务计算;

比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals()。

参考:

转载于:https://www.cnblogs.com/twodoge/p/11527817.html

你可能感兴趣的文章
获取元素样式信息于三中获取方式的区别
查看>>
测试主要环节
查看>>
08-17工作总结
查看>>
遇麻烦,Win7+Ubuntu12.10+Archlinux12.10 +grub
查看>>
基本高精度模板
查看>>
SqlBulkCopy大批量导入数据
查看>>
Windows Workflow Foundation 入门
查看>>
chrome(谷歌浏览器)“无法从该网站添加应用、扩展程序和用户脚本”问题
查看>>
HTTP协议 (四) 缓存
查看>>
python学习之random
查看>>
使用onclick跳转到其他页面/跳转到指定url
查看>>
【转载】测试计划模板
查看>>
pandas 修改指定列中所有内容
查看>>
ubuntu18.04 复制或剪切某文件夹下的前x个文件到另一个文件夹下
查看>>
input的value中有特殊字符
查看>>
字符串压缩
查看>>
用Lua定制Redis命令
查看>>
小程序-canvas在IOS手机层级最高无法展示问题
查看>>
「 Luogu P2285 」打鼹鼠
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>