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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • EventBus使用详解(一)——初步使用EventBus[通俗易懂]

    EventBus使用详解(一)——初步使用EventBus[通俗易懂]前言:EventBus是上周项目中用到的,网上的文章大都一样,或者过时,有用的没几篇,经过琢磨,请教他人,也终于弄清楚点眉目,记录下来分享给大家。相关文章:1、《EventBus使用详解(一)——初步使用EventBus》2、《EventBus使用详解(二)——EventBus使用进阶》一、概述EventBus是一款针对Android优化的发布/订阅事件总线。主要功…

    2022年6月2日
    33
  • 初识ABP vNext(12):模块的独立运行与托管

    初识ABP vNext(12):模块的独立运行与托管

    2020年11月20日
    193
  • AvalonDock结合MVVM模式的应用[通俗易懂]

    AvalonDock结合MVVM模式的应用[通俗易懂]原始代码及文章参考:http://www.codeproject.com/Articles/239342/AvalonDock-and-MVVM环境:VS2010源码:http://files.cnblogs.com/jumahe/AvalonDockMVVMSampleCode.rar1、主界面ViewModel简介主界面由右侧两个Pane和一些要操作的文档(左侧窗体)组成。…

    2022年7月20日
    17
  • 搭建ntp时间服务器(安装sql2000配置服务器失败)

    简介时间服务NTP:NetworkTimeProtocol作用:用来给其他主机提供时间同步服务,在搭建服务器集群的时候,需要保证各个节点的时间是一致的,时间服务器不失为一个好的选择。准备工作关闭防火墙、关闭selinux系统版本:CentOS7.x,NTP服务器IP:10.220.5.111,客户端IP:10.220.5.179安装配置NTP服务器端一、安装ntp[roo…

    2022年4月17日
    33
  • layui弹出层html,layui弹出层效果实现代码

    layui弹出层html,layui弹出层效果实现代码本文实例为大家分享了layui弹出层的具体代码,供大家参考,具体内容如下弹出层大部分演示都在layer独立组件的官网,与内置的layer模块,用法是完全一致的特殊例子Tips:为了更清晰演示,每触发下述一个例子之前,都会关闭所有已经演示的层多窗口模式,层叠置顶配置一个透明的询问框示范一个公告层上弹出右弹出下弹出左弹出左上弹出左下弹出右上弹出右下弹出居中弹出Layui-精心为你雕琢layui.u…

    2022年5月2日
    230
  • 文本分类–多分类

    文本分类–多分类

    2021年9月11日
    50

发表回复

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

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