Double转BigDecimal进行四舍五入操作时会出现数据损失

Double转BigDecimal进行四舍五入操作时会出现数据损失工作中遇到四舍五入的处理,查了资料都是讲三种常见的方法。这里就不说了。实际上你会发现,在用BigDecimal转换时根本不是想像中的那么简单。看代码:java.math.BigDecimalbd=newjava.math.BigDecimal(115.5225);//这里将浮点数转化为BigDecimalDoubled=bd.setScale(3,java.math.Bi

大家好,又见面了,我是你们的朋友全栈君。工作中遇到四舍五入的处理,查了资料都是讲三种常见的方法。这里就不说了。实际上你会发现,在用BigDecimal转换时根本不是想像中的那么简单。看代码:

java.math.BigDecimal bd = new java.math.BigDecimal(115.5225);//这里将浮点数转化为BigDecimal
Double d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();//四舍五入,保留3位小数
System.out.println("BigDecimal : " + bd  + " d : " + d);//输出BigDecimal和四舍五入后的数

输出结果

BigDecimal : 115.5224999999999937472239253111183643341064453125 d : 115.522

发现问题没有?115.5225四舍五入后照理应该是115.523,但是转换为BigDecimal后再处理就不对了。有点儿小邪门儿。

还有更邪门儿的,再试试下面这个:

bd = new java.math.BigDecimal(8.7225);//结尾同样是225
d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();//同样四舍五入,保留3为小数
System.out.println("BigDecimal : " + bd  + " d : " + d);

输出结果

BigDecimal : 8.722500000000000142108547152020037174224853515625 d : 8.723

这里最终结果就是我们想要的结果,是可以正常四舍五入。

你应该已经发现了,是BigDecimal在搞鬼。我给的是常量啊,难道115.5225就天生8.7225比要低一等?凭什么啊!!这tm让我咋整啊??

这儿有一个坏消息和一个好消息,你听哪一个?

额……坏消息是:我tm也不知道为毛BigDecimal这儿调皮,这么喜欢搞歧视。

好消息是:我已经找到了解决方案——等灯等灯

java.math.BigDecimal bd = new java.math.BigDecimal("115.5225");//用字符串来转为BigDecimal 就不调皮了
Double d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("BigDecimal : " + bd  + " d : " + d);

输出结果

BigDecimal : 115.5225 d : 115.523

bd = new java.math.BigDecimal("8.7225");
d = bd.setScale(3, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("BigDecimal : " + bd  + " d : " + d);

输出结果

BigDecimal : 8.7225 d : 8.723

BigDecimal 终于服服帖帖不调皮了

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

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

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


相关推荐

  • share topology_search索引器

    share topology_search索引器如果你知道如何在Rapidshare上搜索的话它就是一个金矿。这里有两个基本方法可以进行搜索,一是使用Google搜索参数对Rapidshare进行搜索,一些网站提供一个基本搜索界面但不如你自己添加参数进行搜索要好。还有一种网站提供自己的搜索数据库进行搜索。第二种网站的搜索更广泛,因为他们使用不同的来源去发现Rapidshare上的新文件包括用户上传的。我不喜欢第一种网站来搜索Rapidshar…

    2025年9月29日
    4
  • c# pdb文件_pdb文件是什么

    c# pdb文件_pdb文件是什么C++编译生成的pdb文件就是符号表。这些符号表,程序运行的时候没有用。但调试的时候有用,主要记录如下东西:全局变量 局部变量 函数名及其实体指针地址 帧指针表 源代码行数使用pdb文件进行调试,要和当前运行的程序一致。…

    2022年10月21日
    5
  • BBSSDK 产品分析

    BBSSDK 产品分析

    2021年6月8日
    110
  • Nginx命令大全[通俗易懂]

    nginx #打开nginxnginx-t   #测试配置文件是否有语法错误nginx-sreopen #重启Nginxnginx-sreload  #重新加载Nginx配置文件,然后以优雅的方式重启Nginxnginx-sstop  #强制停止Nginx服务nginx-squit  #优雅地停止Nginx服务…

    2022年4月13日
    45
  • 查看所有java进程命令_查看java线程

    查看所有java进程命令_查看java线程linux查看java进程数[2021-02-1008:01:50]简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace(“/(\s|\&nbsp\;| |\xc2\xa0)/”,””,strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教linux查看端口被哪个进程占用的方法:1、使用“lsof-…

    2025年7月22日
    3
  • linux系统如何配置ssh链接方式【以kali linux系统为例】【有一个坑,网上很多配置找不到PermitRootLogin选项】

    linux系统如何配置ssh链接方式【以kali linux系统为例】【有一个坑,网上很多配置找不到PermitRootLogin选项】参考:https://blog.csdn.net/nzjdsds/article/details/82262228【非常重要】在/etc/ssh/ssh_config中没有PermitRootLoginyes选项的话,就要在sshd_config文件中寻找!必须配置的选项:第一:root权限:第二:密码权限:第三:端口22:配置完毕之后重启sys…

    2022年5月30日
    86

发表回复

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

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