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)
上一篇 2022年5月16日 下午12:40
下一篇 2022年5月16日 下午12:40


相关推荐

  • Windows操作系统双因素身份认证解决方案

    Windows操作系统双因素身份认证解决方案Windows桌面帮助企业将办公桌面快速、集中部署在平台上,方便进行管理维护且节省企业成本,能让员工随时随地登录到自己的windows桌面环境中,实现移动办公。安全事件频发的现在,在单一的静态密码登录验证机制下,非法入侵者若窃听到桌面登录账号的用户名及密码,即可通过合法访问权限访问内部系统,企业信息安全面临挑战;企业为防止账号信息泄露,通常强制要求员工定期更换登录密码,给员工及IT运维人员带来许多不必要的麻烦;其次没有及时收回的账号,离职员工仍然有桌面的合法访问权限,因此额外增加了IT部门的账号回收管理

    2025年7月9日
    7
  • 美国100部推理小说排行榜第一_好看的悬疑小说排行榜前十名

    美国100部推理小说排行榜第一_好看的悬疑小说排行榜前十名这份书单是美国推理作家协会(TheMysteryWritersofAmerica,简称MWA)票选出来的史上最经典的一百部推理小说排行榜。评选过程极为复杂,首先由推理协会选出本格派、硬汉派、惊悚派、间谍小说等推理小说十个主要流派的十个代表作家,再由这十个作家选出各流派的十部代表作品,然后由协会会员投票排出名次。所以这份书单不仅仅有总的一百强排行榜,还有各个不同流派的十大杰作排名,其中本格和…

    2026年4月17日
    7
  • java session id 生成_Java通过sessionId获取Session「建议收藏」

    java session id 生成_Java通过sessionId获取Session「建议收藏」Servlet2.1之后不支持SessionContext里面getSession(Stringid)方法。但是,我们可以通过HttpSessionListener监听器和全局静态map自己实现一个SessionContext。MySessionContext.java:publicclassMySessionContext{privatestaticHashMapmymap=n…

    2022年7月16日
    53
  • 用NanoBananaPro完美复刻任何图片的提示词

    用NanoBananaPro完美复刻任何图片的提示词

    2026年3月17日
    2
  • 王永庆:从借200元钱起家

    王永庆:从借200元钱起家nbsp 6 月 5 日 台塑集团在股东大会结束后宣布了自企业成立以来最重大的一次人事变动 担任台塑集团董事长达半个世纪之久的王永庆卸任 职位由原台塑总经理李志村接任 王永庆弟弟王永在的长子王文渊升任总裁 副总裁一职则由王永庆的女儿王瑞华担任 今后 台塑集团将进入由职业经理人和王家第二代联手管理的 同治时代 但王永庆和王永在兄弟仍是台塑集团的精神领袖 从米店小老板到塑胶大王

    2026年3月18日
    2
  • Spring核心——Bean的定义与控制

    Spring核心——Bean的定义与控制

    2021年6月7日
    110

发表回复

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

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