新手注意:Java中使用BigDecimal类时要避免的坑

新手注意:Java中使用BigDecimal类时要避免的坑1 两数相除无限循环小数问题直接看例子 01 Testpublic void BigNumber Test nbsp nbsp BigDecimal bd new BigDecimal 10 nbsp nbsp BigDeci

大家好,欢迎来到IT知识分享网。

1、两数相除无限循环小数问题

直接看例子01:

@Test public void BigNumber_Test () {    BigDecimal bd = new BigDecimal("10");    BigDecimal divNum = new BigDecimal("3");    // 除法遇到除不尽时,这种写法会抛出异常ArithmeticException    BigDecimal bigDecimal = bd.divide(divNum); // NG java.lang.ArithmeticException    System.out.println(bd.divide(divNum, 2)); // OK    System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_UP)); // OK    System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_DOWN)); // OK    System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_CEILING)); // OK    System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_FLOOR)); // OK    System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_HALF_UP)); // OK    System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_HALF_EVEN)); // OK    System.out.println(bd.divide(new BigDecimal("4"), 2, BigDecimal.ROUND_UNNECESSARY)); // OK }

除了NG行,其他行的输出结果依次为:

4 3.34 3.33 3.34 3.33 3.33 3.33 2.50

总结:果两数相除,除不尽时,需要指定保留精度和进位方式,否则会抛出异常。

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

2、对象比较时含精度比较问题

直接看例子02:

@Test public void BigNumber_Test () {    BigDecimal bd = new BigDecimal("3");    BigDecimal divNum = new BigDecimal("3.00");    System.out.println(bd.equals(divNum)); // 输出 false    System.out.println(bd.compareTo(divNum)); // 输出 0    BigDecimal divNum2 = new BigDecimal("3.00");    System.out.println(divNum.equals(divNum2)); // 输出 true    System.out.println(divNum.compareTo(divNum2)); // 输出 0 }

总结:若要严格含精度对比是否相等需要用equals方法,若只是比较数值的大小忽略精度用compareTo方法。

3、创建对象时精度丢失问题

直接看例子03:

@Test public void BigNumber_Test () {    BigDecimal bd = new BigDecimal(1.15666); // 入参是double    BigDecimal divNum = new BigDecimal("1.15666"); // 入参是String    System.out.println(bd); // 输出:1.0000075    System.out.println(divNum); // 输出:1.15666 }

总结:如果要严格保留精度,应该避免使用浮点类型做入参进行构造,尽量使用字符串格式进行构造。

新手注意:Java中使用BigDecimal类时要避免的坑

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/188905.html

(0)
上一篇 2025-09-25 08:15
下一篇 2025-09-25 08:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信