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


相关推荐

  • 使用 Java8的 stream对list数据去重,使用filter()过滤列表,list转map「建议收藏」

    使用 Java8的 stream对list数据去重,使用filter()过滤列表,list转map「建议收藏」list去重,根据对象某个属性、某几个属性去重去除List中重复的StringListunique=list.stream().distinct().collect(Collectors.toList());去除List中重复的对象//Person对象publicclassPerson{privateStringid;…

    2022年5月9日
    398
  • modelsim se 10.5安装教程

    modelsim se 10.5安装教程modelsimse10.5安装教程简介modelsim10.5是由mentorgraphics公司推出的一款具备强大的仿真性能与调试能力的HDL设计验证环境,也是唯一的单内核支持VHDL和Verilog混合仿真的仿真器,提供最友好的调试环境,采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真,并且具有个性化的图形界面和用户接口,能够为用户加快调试提供强有力的手段。而且软件全面支持VHDL和Verilog语言的IEEE标准,以及IEEEVITAL1076.4-95标准,与C语言功能调

    2022年5月10日
    50
  • 如何入侵网站数据库_数据库创建用户

    如何入侵网站数据库_数据库创建用户BrainCOSMOS:昨日在被黑客公布的csdn用户数据库中发现了自己的帐号和密码(还有各种大牛的技术博客帐号密码),立刻想到了自己其他帐号有没有其他帐号用相同密码。还好我的每个密码都有区分,不过今早听说人人网的信息也被发布出来了,顿时就火了,奉劝各位赶紧更改自己的密码,免得被人恶意使用!涉及到的网站有:人人网、U9网、百合网、开心网、天涯、世纪佳缘等一批知名网站具…

    2022年9月15日
    2
  • pytorch Tensor转numpy并解决RuntimeError: Can‘t call numpy() on Tensor that requires grad.报错

    pytorch Tensor转numpy并解决RuntimeError: Can‘t call numpy() on Tensor that requires grad.报错解决方法转numpy时使用Tensor.detach().numpy():a=torch.ones(5)b=a.detach().numpy()print(b)问题解析当计算中的tensor转换时,由于它带梯度值时,因此不能直接转为numpy格式,所以最好不论如何都调用一下.detach().numpy()…

    2022年10月19日
    2
  • python 之字符编码

    一了解字符编码的储备知识python解释器和文件本编辑的异同相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样不同点:文本编辑器

    2022年3月29日
    49
  • anaconda跟pycharm_Python中的数组

    anaconda跟pycharm_Python中的数组Anaconda是一个科学计算环境,当在电脑上安装好Anaconda3以后,就相当于安装好了Python,还有一些常用的库,如numpy,scrip,matplotlib等库。(如果你这里没有安装anaconda的话,直接安装了Python,装完Python想要使用这些库的话还要在cmd中运行pipinstall…

    2022年8月28日
    2

发表回复

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

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