BigDecimal进行除法运算时的坑

 

循环小数输出的坑

  BigDecimal做除法时如果出现除不尽(循环小数)的情况,会抛异常:

BigDecimal a = new BigDecimal("1");
System.out.println(a.divide(new BigDecimal(3)));

   异常如下:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
       at java.math.BigDecimal.divide(BigDecimal.java:1693) 
  解决办法:使用如下两个函数设置精度
  • divide(num, scale)
  • divide(num, scale, roundingMode)
  •  其中,scale 是保留的位数
System.out.println(a.divide(new BigDecimal(30), 2,BigDecimal.ROUND_HALF_UP)); 

构造函数的坑

  先看下面这段代码: 
public static void main(String[] args) {
    BigDecimal value1 =new BigDecimal(1024.511);
    System.out.println("value1: " + value1);
    BigDecimal value2 = new BigDecimal("1024.511");
    System.out.println("value2: " + value2);
}

    按照我们的预想,value1输出的应该是10.511,可是实际的值却不是这样,如下: 

value1: 10.510999999999999232613845379091799259185791015625
value2: 10.511 
    当我们用double类型的数据作为参数时,构造出的 BigDecimal 对象 value1 并不能保证数据的准确性。而用 String 作为参数构造对象时,数据丝毫不差。 

Reference

 
posted @   楼兰胡杨  阅读(4059)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示