java BigDecimal解决浮点数的精度丢失和大数计算问题
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!