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


相关推荐

  • Oracle获取字符串的最后几位

    Oracle获取字符串的最后几位substr(字符串,-10)Oracle字符串函数substr(字符串,截取开始位置,截取长度)1.如果最后一个截取长度参数为空,则表示从截取开始位置起截到最末2.如果截取开始位置为大于0的数字,则表示从字符串左数几位开始3.如果截取开始位置为小于0的数字,则表示从字符串右数几位开始……

    2025年7月11日
    3
  • emwin 界面设计_emwin image控件

    emwin 界面设计_emwin image控件图中蓝色那一句,在WM_PAINT中绘制。

    2022年10月14日
    4
  • cas与乐观锁(jpa乐观锁)

    独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的线程释放锁。所谓乐观锁就是每次不加锁,假设没有冲突而去完成某项操作;如果发生冲突了那就去重试,直到成功为止。CAS(CompareAndSwap)是一种有名的无锁算法。CAS算法是乐观锁的一种实现。CAS有3个操作数,内…

    2022年4月15日
    217
  • idea2021激活码在线生成[免费获取]

    (idea2021激活码在线生成)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

    2022年3月20日
    162
  • win10系统下pycharm2017配置opencv-python3.4.5[通俗易懂]

    win10系统下pycharm2017配置opencv-python3.4.5[通俗易懂]1.首先打开Pycharm,点击文件-设置-项目-projectinterpreter,查看python版本,我的显示是3.6.8,如下图:2.打开opencv-python官网,下载对应版本的opencv-python,如下图:3.点击win+R,输入cmd,即打开了命令窗口,由于我给pycharm配置的解释器是用anaconda装的,所以我需要把opencv-python安装…

    2022年8月26日
    3
  • cubieboard mysql_Cubieboard A10 安装Nand系统,配置nginx,php,mysql,samba详细教程[通俗易懂]

    cubieboard mysql_Cubieboard A10 安装Nand系统,配置nginx,php,mysql,samba详细教程[通俗易懂]安装前置条件1.下载win32diskimager-v0.7-binary.zip2.下载debian_wheezy_armhf_v1_mele.zip3.下载cubie_nand_uboot_partition_image.zip4.下载FlashFXP.zip5.下载PanasonicSDFormatter.zip6.下载puttyfile_0.62cn.zip以上文件下载地址:http://…

    2022年7月22日
    10

发表回复

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

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