当前位置:首页 > 后端开发 > BigInteger、BigDecimal、数字格式化

BigInteger、BigDecimal、数字格式化

7个月前 (05-25)40

BigInteger与BigDecimal的目的是用来精确地表示大整数和小数,常用于商业计算中。

BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息。
BigDecimal:可以精确地表示任意精度的小数,同时在运算过程中不会丢失任何信息。

BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,由于创建对象会引起开销,因此它们不适合于大量的数学运算。

BigDecimal够造方法的参数类型有4种,其中的两个用BigInteger构造,另一个是用double构造,还有一个使用String构造。

应该避免使用double构造BigDecimal,因为:有些数字用double根本无法精确表示,传给BigDecimal构造方法时就已经不精确了。比如,new BigDecimal(0.1)得到的值是0.1000000000000000055511151231257827021181583404541015625。使用new BigDecimal("0.1")得到的值是0.1。因此,如果需要精确计算,用String构造BigDecimal,避免用double构造,尽管它看起来更简单!

equals()方法认为0.1和0.1是相等的,返回true,而认为0.10和0.1是不等的,结果返回false。方法compareTo()则认为0.1与0.1相等,0.10与0.1也相等。所以在从数值上比较两个BigDecimal值时,应该使用compareTo()而不是 equals()。

另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1除以9会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时,BigDecimal可以让您显式地控制舍入。

数字格式话一般会用到DecimalFormat、NumberFormat或则String.format:
DecimalFormat df1 = new DecimalFormat("#,###.000");
System.out.println(df1.format(1234.527));//1,234.527

DecimalFormat df2 = new DecimalFormat("#.00");
System.out.println(df2.format(1234.527));//1234.53,有四舍五入

DecimalFormat df3 = new DecimalFormat("##.00%");    //##.00%   百分比格式,后面不足2位的用0补齐
System.out.println(df3.format(0.527));//52.70%

NumberFormat nf = NumberFormat.getPercentInstance();
nf.setMinimumFractionDigits(3);    // 保留到小数点后几位
System.out.println(nf.format(0.527));//52.700%

System.out.println(String.format("%02d", 5));//05
System.out.println(String.format("%.3f", 3.14159));//3.142,%. 表示小数点前任意位数, 2 表示两位小数, f 表示浮点型

NumberFormat format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(3);//设置小数部分允许的最小位数
format.setMaximumFractionDigits(5);//设置小数部分允许的最大位数
format.setMaximumIntegerDigits(10);//设置整数部分允许的最大位数。
format.setMinimumIntegerDigits(0);//设置整数部分允许的最小位数
System.out.println(format.format(2132323213.23266666666)); 2,132,323,213.23267

作者:zero__007
来源链接:https://blog.csdn.net/zero__007/article/details/51326496

标签: BigDecimal

“BigInteger、BigDecimal、数字格式化” 的相关文章

new BigDecimal时,请使用字符串

一、构造BigDecimal BigDecimal提供了丰富的构造函数,可以通过int、long、double、String等来构造一个Big...

常用类库之BigDecimal类

常用类库之BigDecimal类

目录 一、重要常用方法:+、-、×、÷ 二、所有方法 由于float类和double类在运算时容易出现误差,于是需要借助BigDecimal类控制精...

BigDecimal源码

import java.math.BigDecimal;/** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 *&nb...

stream对bigdecimal求和

对YsHouseInfo.contractAmt求和 BigDecimal agreConAmt = houseInfos.stream()...

[转]BigDecimal使用(整理)

原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.B...

BigDecimal.setScale用法总结

ROUND_DOWN(直接省略掉指定位数后的内容) BigDecimal bigDecimal = new BigDecimal(“2.12...

java里的BigInteger和BigDecimal

java里的BigInteger和BigDecimal

阶乘: View Code 1 import java.io.*; 2 import java.math.*; 3 public class B...

BigDecimal详解和BigDecimal丢失精度

BigDecimal详解和BigDecimal丢失精度

Java代码   import java.math.BigDecimal;    /** &n...

BigDecimal类型 使用学习

一、BigDecimal简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double...

Java大数据之BigDecimal

Java大数据之BigDecimal

一、和BigInteger的区别 整型大数据:BigInteger 浮点型大数据:BigDecimal 二、常量 BigDecim...