一篇文章讲明白double、float丢失精度的问题

1.背景

1.1+0.1 = 1.2000000000000002

发现上面计算的值竟然和数学计算不一致

2. 问题

计算机是通过二进制计算的,如果我们在二进制的视角来看待上面问题,就很容易发现问题了。
例如:把「0.1」转成二进制的表示,然后还原成十进制,就能看出问题。

3. 0.1转二进制

小数转二进制,是通过除法进行的

0.1 = 1 ÷ 10

很简单,二进制就是要算

1 ÷ 1010

最终0.1转二进制是:0.0001100110011001100110011001100110011001100110011001101

在这里插入图片描述

4.转换成对应精度数值

float的精度为7~8位有效数字,7位肯定能保证,8位的值也存在。
double的精度为16~17位有效数字
所以
二进制展示

1.1+0.1 = 1.0011001100110011001100110011001100110011001100110100

十进制展示

1.1+0.1 = 1.2000000000000002

5.解决方案

针对浮点数丢失精度的问题,我们可以通过BigDecimal来解决
new BigDecimal(double val)
该方法是不可预测的,以0.1为例,你以为你传了一个double类型的0.1,最后会返回一个值为0.1的BigDecimal吗?不会的,原因在于,0.1无法用有限长度的二进制数表示,无法精确地表示为双精度数,最后的结果会是0.100000xxx。
new BigDecimal(String val)
该方法是完全可预测的,也就是说你传入一个字符串"0.1",他就会给你返回一个值完全为0,1的BigDecimal,官方也表示,能用这个构造函数就用这个构造函数叭。
BigDecimal.valueOf(double val)
第二种构造方式已经足够优秀,可你还是想传入一个double值,怎么办呢?官方其实提供给你思路并且实现了它,可以使用Double.toString(double val)先将double值转为String,再调用第二种构造方式,你可以直接使用静态方法:valueOf(double val)。

    总结:将double转为BigDecimal的时候,需要先把double转换为字符串,然后再作为BigDecimal(String val)构造函数的参数,这样才能避免出现精度问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139840.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无声的世界,精神科用药并结合临床的一些分析及笔记(九)

住院计划表 她宫颈癌的手术决定在中心妇产医院进行,由于她抑郁症的爆发,也需要在安定医院调理,我决定制定一个住院计划,征求她和大夫的同意: 节点1:在安定医院治疗抑郁症,调整心理状态&#x…

nginx正向代理、反向代理、负载均衡(重中之重)

nginx中有两种代理方式: 七层代理(http协议) 四层代理(基于tcp或udp的流量转发) 一、七层代理 原理:客户端请求代理服务器,由代理服务器转发客户端的http请求,转发到内部的服务器…

网工内推 | 上市公司运维专员,NA/NP认证优先,享有股票期权

01 益盟股份 招聘岗位:网络运维专员 职责描述: 1、公司呼叫中心电话系统日常维护(汉天系统); 2、熟悉思科交换机的配置,对硬件故障能有基本的判断; 2、熟悉域控使用环境及windows Server使用&a…

Docker安装ES7.14和Kibana7.14(无账号密码)

一、Docker安装ES7.14.0 1、下载镜像 docker pull elasticsearch:7.14.0 2、docker安装7.14.0 mkdir -p /usr/local/elasticsearch/config mkdir -p /usr/local/elasticsearch/data chmod 777 -R /usr/local/elasticsearch/ echo "http.host: 0.0.0.0" >> /u…

自定义训练 YOLOv8 分割模型,并以 TFlite 部署

如果你以前使用过目标检测,是否曾因边界框未正确包围物体而感到沮丧?或者它提供了错误的或不完整的包围?那可以尝试使用图像分割,它比目标检测更先进,因为它完全包围了物体。对物体进行分割之后,可以快速将…

基于模型预测人工势场的船舶运动规划方法,考虑复杂遭遇场景下的COLREG(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MongoDB实战之快速开始

写在前面:以前使用mongo只了解了个增删改查,而且没有集成springboot里面使用过。最近花了几小时系统的学习了一遍MongoDB,为了巩固和方便查找,在此记录下学习过程。 一、MongoDB的简介 MongoDB 是一个高性能、高可用性和易扩展的 NoSQL 数据…

细说雪花算法

文章目录 背景一、介绍二、结构三、数据库分表1.垂直分表2.水平分表(1)主键自增(2)取模(3)雪花算法(主角登场) 总结 背景 需要选择合适的方案去应对数据规模的增长,以应…

kibana操作elasticsearch(增删改查)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

论文阅读 Memory Enhanced Global-Local Aggregation for Video Object Detection

Memory Enhanced Global-Local Aggregation for Video Object Detection Abstract 人类如何识别视频中的物体?由于单一帧的质量低下,仅仅利用一帧图像内的信息可能很难让人们在这一帧中识别被遮挡的物体。我们认为人们识别视频中的物体有两个重要线索&…

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的,什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件,实现缓存多个组件实例切换时,完成对卸载组件实例的缓存,从而使得组…

信号隔离的利器:光耦合器的应用与重要性 | 百能云芯

在当今数字化和电子技术的时代,各种电子设备和电路在我们的日常生活和工作中扮演着至关重要的角色。为了使这些设备正常运行并确保它们之间的相互作用,一种叫做光耦合器(CTR)的元件扮演着重要的连接桥梁角色。接下来云芯将带您深入…