0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

BigDecimal实际开发的三坑是什么

汽车电子技术 来源:程序猿知秋 作者:知秋 2023-02-16 14:39 次阅读

坑1:初始化使用double类型数据

public class TestBigDecimal {
    public static void main(String[] args){
        BigDecimal b1=new BigDecimal(0.22);
        BigDecimal b2=new BigDecimal("0.22");
        System.out.println("b1的值:"+b1);
        System.out.println("b2的值:"+b2);
    }
}

结果

b1的值:

0.2200000000000000011102230246251565404236316680908203125

b2的值:0.22

原因:

构造方法参数为double类型有一定的不可预知性,表面上看是0.22,实际上是0.2200000000000000011102230246251565404236316680908203125,0.22在java中无法准确的表示为double

解决方案:

1.采用String 类型的构造参数。

2.如果必须要使用double,则可使用Double.toString(double) 方法转换成String, 再采用Bigdecimal的构造函数.

坑2:除法计算

public static void t1(){
    BigDecimal b1=new BigDecimal("10");
    BigDecimal b2=new BigDecimal("3");
    System.out.println(b1.divide(b2).setScale(2,BigDecimal.ROUND_HALF_UP));
}

结果:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

原因:

当遇到除不尽的情况时,会报以上错误

解决方案:

System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));

坑3:equals方法

public static void t2(){
    BigDecimal b1=new BigDecimal("0.0");
    BigDecimal b2=BigDecimal.ZERO;
    System.out.println(b1.equals(b2));
}

结果:

false

原因:

BigDecimal 的equals 方法不仅仅是比较值,还会比较scale的位数是否相等,而Bigdecimal.ZERO的scale是0,所以为 false

解决方案:

使用compareTo方法. System.out.println(b1.compareTo(b2)==0)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 参数
    +关注

    关注

    11

    文章

    1838

    浏览量

    32261
  • Doubler
    +关注

    关注

    0

    文章

    7

    浏览量

    7199
  • string
    +关注

    关注

    0

    文章

    40

    浏览量

    4736
收藏 人收藏

    评论

    相关推荐

    R128点屏踩笔记

    本文所整理的R128点屏踩笔记均是在参考以下应用开发案例进行屏幕适配时遇到的实际开发问题,涵盖了屏幕花屏、屏幕白屏、LVGL显示颜色错误等常见问题的解决方法。
    的头像 发表于 12-03 10:17 1371次阅读
    R128点屏踩<b class='flag-5'>坑</b>笔记

    死创业者的硬件产品——“十大

    死创业者的硬件产品——“十大”第一:错把产品原型当批量生产第二:以为可以修补bug;第
    发表于 11-14 15:59

    NodeMCU开发板踩经历分享

    写在前面今天入手了一个NodeMCU的板子,准备学习一下物联网相关的知识。不过由于博主学艺不精,在第一步烧写固件上就踩了,所以就想着把自己的踩经历写出来分享给大家,希望能有一些帮助~ 材料准备硬件:NodeMCU开发板*1(
    发表于 11-01 07:55

    mongoose开发中遇到的及解决方案

    1. 本文不对mongoose的功能作陈述,只记录下自己开发中遇到的,及解决方案。嵌入了mongoose的代码编译通过,在调试运行(gdb)时候,却发生了段错误(Segmentation fault),如下所示:...
    发表于 12-16 06:56

    大学时光、单片机开发,嵌入式网站推荐

    大学时光、单片机开发,嵌入式网站推荐
    发表于 11-20 11:51 8次下载
    入<b class='flag-5'>坑</b>大学时光、单片机<b class='flag-5'>开发</b>,嵌入式网站推荐

    关于蓝桥杯单片机开发板矩阵键盘的一些

    关于蓝桥杯单片机开发板矩阵键盘的一些
    发表于 11-23 17:36 2次下载
    关于蓝桥杯单片机<b class='flag-5'>开发</b>板矩阵键盘的一些<b class='flag-5'>坑</b>

    ESP-32开发历程()ESP-IDF 定时器使用

    ESP-32开发历程()ESP-IDF 定时器使用前言一、开发基础二、定时器使用1.官方描述2.读入数据总结ESP-32开发
    发表于 12-08 12:06 13次下载
    ESP-32<b class='flag-5'>开发</b>踩<b class='flag-5'>坑</b>历程(<b class='flag-5'>三</b>)ESP-IDF 定时器使用

    BigDecimal使用失误的原因分析

    BigDecimal 自身也提供了很多构造器方法,这些构造器方法使用不当可能会造成不必要的麻烦甚至是金额损失,从而引起事故资损。
    的头像 发表于 07-10 14:35 964次阅读

    软件开发外包有哪些要注意?

    提起软件开发外包,大家并不陌生,因为很多企业已经选择了软件外包,但是有人会说软件开发外包就是个,千万别选择软件外包。   其实软件外包是没有问题的,问题出在选择的软件开发外包公司上面
    的头像 发表于 10-11 18:36 1440次阅读

    bigdecimal转string类型

    BigDecimal转换为String类型是在Java编程中常常遇到的一个问题。BigDecimal是Java中用于表示高精度十进制数的类,而String则是用于表示文本字符串的数据类型。在某些
    的头像 发表于 11-30 11:09 6429次阅读

    怎么把bigdecimal转成string

    BigDecimal转换为String是一项常见的任务,在Java的开发中经常会涉及到将数值进行格式化,并在不同的环境中传递。本文将详解以下几个方面的内容: 什么是BigDecimal
    的头像 发表于 11-30 11:11 1388次阅读

    bigdecimal转string类型避免空指针

    在Java中,BigDecimal是用于处理高精度数字计算的类。它提供了一种有效的方法来避免使用浮点数的精确度损失问题。然而,在将BigDecimal对象转换为String类型时,需要特别小心以避
    的头像 发表于 11-30 11:12 2697次阅读

    bigdecimal转字符串保留两位小数

    BigDecimals是Java中用于表示任意精度的十进制数的类。在许多应用程序中,可能需要将一个BigDecimal转换为字符串并保留两位小数。在本文中,我们将探讨如何使用BigDecimal
    的头像 发表于 11-30 11:18 4468次阅读

    bigdecimal的加减乘除java

    BigDecimal是Java中提供的一个用于精确计算的类,它可以实现浮点数的精确加减乘除运算,避免了在使用浮点数进行计算时可能出现的舍入误差。 首先,我们需要明确一点,浮点数在计算机中是以二进制
    的头像 发表于 11-30 11:19 1479次阅读

    bigdecimal是什么数据类型

    BigDecimal是Java编程语言中的一个类,用于表示任意精度的十进制数。它是在数值计算方面提供更高精度和更多功能的一个解决方案。常规的浮点数类型(如float和double)有精度限制,可能会
    的头像 发表于 11-30 11:21 3119次阅读