double 转 BigDecimal 精度问题

double 转 BigDecimal 精度问题请看图://double转BigDecimal精度测试@Testpublicvoida(){DoubleDou=5.56;BigDecimalbigDou1=newBigDecimal(Dou);BigDecimalbigDou2=BigDecimal.valueOf(Dou);…

大家好,又见面了,我是你们的朋友全栈君。

请看图:

    //double 转 BigDecimal 精度测试
    @Test
    public void a (){
        Double Dou = 5.56;
        BigDecimal bigDou1 = new BigDecimal(Dou);
        BigDecimal bigDou2 = BigDecimal.valueOf(Dou);
        log.info("Double转BigDecimal,使用构造方法转化="+bigDou1);//5.55999999999999960920149533194489777088165283203125
        log.info("Double转BigDecimal,使用字符串形式转化="+bigDou2);//5.56
    }

很明显,经过 double 转 BigDecimal 后,我们最初的值已经发生变化,所以通常我们在做类型转换的时候推荐使用 BigDecimal.valueOf(…);

分析:JDK1.8 源码

BigDecimal bigDou1 = new BigDecimal(Dou);

这个转换结果是double的二进制浮点值的精确十进制表示,其值得结果不是我们可以预测的,如上测试类,经过类型转换:5.56变成了5.55999999999999960920149533194489777088165283203125。是因为转化过程默认使用了精度和舍入模式:

public BigDecimal(double val, MathContext mc) {}; 舍入模式为:public final static int ROUND_HALF_UP =4;也是一种四舍五入,官方解释:該四舍五入模式向“最近邻居”转弯,除非两个邻居都是等距的,在这种情况下是圆括弧的。

BigDecimal bigDou2 = BigDecimal.valueOf(Dou);

源码:  

  public static BigDecimal valueOf(double val) {

        return new BigDecimal(Double.toString(val));
    } 

使用double通过所提供的规范的字符串表示Double.toString(double)方法。调用BigDecimal bigDou2 = BigDecimal.valueOf(“String”);此时5.56=5.56.所以进行类型转换推荐此方法。

 另外:如果数据库存储,可以直接写入 double。

INSERT INTO statistic_info (`id`,`amount`)  VALUES (#{bean.id},#{bean.amountDouble});

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136111.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Pycharm 最新激活码 2021[免费获取]

    (Pycharm 最新激活码 2021)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSWQi…

    2022年3月21日
    51
  • mysql解决大量time_wait[通俗易懂]

    mysql解决大量time_wait[通俗易懂]mysql解决大量time_wait

    2022年4月21日
    140
  • Linux smart_linux安装smartctl

    Linux smart_linux安装smartctlSmartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(SelfMonitoringAnalysisandReportingTechnology),自动检测分析及报告技术)技术来实现的,SMART技术可以对硬盘的磁头单元、盘片电机驱动系统、硬盘内部电路以及盘片表面介质材料等进行监测,当SMART监测并分析出硬盘可能出现问题时会及时向用户报警以避免计算机数据受损失。SMART技术必须在主板支持的前提下才能发生作用,而且SMART技术也不能保证能预报所有可能发生的硬盘故障。

    2022年10月8日
    0
  • 新手必备webstorm安装教程

    新手必备webstorm安装教程接下来我们看一下webstorm的安装1.首先下载webstrom安装包这个安装包在网上很好找点击.exe文件激活成功教程为长期有效的webstrom/IDEAlicenseserver20181.复制下方activationcode,直接粘贴在webstorm的activationcode栏上,切记先不要点ok,切记先不要点ok,切记先不要点ok,等第二步执行完…

    2022年6月15日
    76
  • Qt编写安防视频监控系统1-通道切换

    Qt编写安防视频监控系统1-通道切换一、前言通道切换在视频监控系统中是最基础的必备功能,一般都会提供1通道+4通道+6通道+8通道+9通道+16通道这几个通道切换,可能做得比较好的还会提供24通道+32通道的,这个可能对电脑的配置就有一定要求了,一般来说,超过9个通道实时显示视频流,基本上会采用子码流来显示,如果都采用主码流,电脑压力非常巨大,CPU占用很高,内存也高,不过现在的电脑配置越来越高,基本上四千多的台式机,配置已经非常…

    2022年7月15日
    19
  • php 递归[通俗易懂]

    php 递归[通俗易懂]php 递归

    2022年4月20日
    28

发表回复

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

关注全栈程序员社区公众号