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 终于服服帖帖不调皮了

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vb教程编程实例详解pdf_vb程序设计教程答案刘炳文

    vb教程编程实例详解pdf_vb程序设计教程答案刘炳文实验8-1编写如图2.8.1所示的应用程度。若单击“建立文件”按钮,则分别用Print#和和Write#语句将三个同学的学号、姓名和成绩写入Score.dat和Score1.dat;若单击“读取文件”按钮,则用lineInput语句按行将两个(当前目录)文件中的数据显示在相应的文本框。其中:学号和姓名是字符串类型,成绩是整型。解题,画2个按钮,2个文本框(2个文本框的MultiLin…

  • linux命令杀掉进程_shell脚本获取进程号并杀死进程

    linux命令杀掉进程_shell脚本获取进程号并杀死进程1.查找需要kill掉的线程:ps-elf|grep【线程关键信息】比如:ps-elf|grepjava这样找到所有JAVA线程比如要删除tomcat线程,可以执行:ps-elf|greptomcat这样就可以找到跟tomcat相关的所有线程,从中找到你需要kill掉的线程ID2.强制终止线程:kill-9【线程ID】比如你的线程ID是5645646,那就可以执行:kill-95645646【特殊用法】kill-STOP[pid]发..

  • docker中启动mysql_win10启动项命令

    docker中启动mysql_win10启动项命令前提:已经装好了mysql镜像官方推荐必须使用密码故命令为:dockerrun–namemysql01-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.5但是没有做端口开放,外界访问不到!故先停止这个容器:在启动加了端口映射的mysqldockerrun-p3306:3306–namemysql02-eMYSQL_R…

  • 51单片机流水灯的三种实现方法「建议收藏」

    51单片机流水灯的三种实现方法「建议收藏」首先,介绍下原理。下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。              实现8个LED流水灯程序用中

  • 好的留言本,看看呀!

    好的留言本,看看呀!

  • rabbitmq集群搭建_集群搭建步骤

    rabbitmq集群搭建_集群搭建步骤MQ为什么要使用集群?单机版无法满足真实应用的要求,如果RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故障等情况况,该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量,那么如果应用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机RabbitMQ务的性能显得不足,此时搭建一个RabbitMQ集群才是解决实际生产中问题的关键。准备环境虚拟机环境:VMware®Workstation16Pro虚拟机版本:16.1.2build-1

发表回复

您的电子邮箱地址不会被公开。

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