java BigDecimal解决浮点数的精度丢失和大数计算问题

2023-08-09,

java BigDecimal解决浮点数的精度丢失大数计算问题

抛出浮点数问题:

先考个题,输入什么?

System.out.println(0.1 + 0.2);

答案:0.30000000000000004

在我们日常数学计算中,0.1+0.2不是等于0.3吗?为什么会等于0.30000000000000004?

因为这是计算机,计算机只认识二进制,0.1 0.2转换二进制相加是不能转成完整的二进制的

所以就会出现精度丢失问题,这无疑是个巨大的问题

解决精度丢失问题:

使用BigDecimal来解决刚刚那个问题:

BigDecimal bigDecimal = new BigDecimal("0.1");
BigDecimal bigDecimal2 = new BigDecimal("0.2");
System.out.println(bigDecimal.add(bigDecimal2)); // 0.3

原理:我们都知道整数运算是没有精度的,我们可以先把浮点数乘N转换成整数再进行运算,运算出的结果再除N

System.out.println(0.1 + 0.2); // 0.30000000000000004
System.out.println((double) (0.1 * 10 + 0.2 * 10) / 10); // 0.3

抛出大数问题:

众所周知,我们的基本数据类型long最大只能是9223372036854775807,如果我们超过了这个数字咋么办?

解决大数字问题:

使用BigDecimal来解决刚刚那个问题:

BigDecimal bigDecimal = new BigDecimal(Long.valueOf(Long.MAX_VALUE).toString());
BigDecimal bigDecimal2 = new BigDecimal(Long.valueOf(Long.MAX_VALUE).toString());
System.out.println(bigDecimal.add(bigDecimal2)); // 18446744073709551614

BigDecimal

构造函数:

BigDecimal(int)
BigDecimal(double)
BigDecimal(long)
BigDecimal(String)

其中对于double类型参数的构造方法,在不能完全由二进制表示完全的时候,仍然会出现精度缺失的情况,如果要传入一个double类型的数据,建议用String类型来代替如:BigDecimal(“0.3”);

常用方法:

加法 :bigDecimal.add(BigDecimal )

减法:bigDecimal.subtract(BigDecimal )

乘法:bigDecimal.multiply(BigDecimal )

除法:bigDecimal.divide(BigDecimal )

方法的返回值都是Bigdecimal 类型

java BigDecimal解决浮点数的精度丢失和大数计算问题的相关教程结束。

《java BigDecimal解决浮点数的精度丢失和大数计算问题.doc》

下载本文的Word格式文档,以方便收藏与打印。