【笔记】float类型的精度有限,无法精确表示123456.6789

一、前情提要

有个Java数据转换的小示例:

public class Example2_2 {public static void main(String[] args) {float f = 123456.6789f;System.out.printf("f=%30.12f", f);}
}

输出的结果是:
在这里插入图片描述

123456.679687500000

这里就发现了个问题,我变量f定义的值是123456.6789,为什么输出的结果小数位变了呢??

简单来说,核心原因是 float类型的精度有限,无法精确表示123456.6789

Java 中float是32 位单精度浮点数,遵循 IEEE 754 标准。它的存储结构由 1 位符号位、8 位指数位和 23 位尾数位(实际有效精度约 24 位)组成。
这种结构导致float只能精确表示有限的十进制小数,对于大多数十进制小数(如代码中的123456.6789),它无法精确存储,只能存储一个最接近的近似值。

那么如何理解float类型无法精确表示123456.6789??

要理解“float类型无法精确表示123456.6789”,需要从计算机如何存储小数说起。这本质上是“二进制与十进制的转换限制”和“float的存储空间有限”共同导致的问题,我们一步步拆解:

二、计算机如何存储小数以及float空间限制

1. 计算机只认识二进制,不认识十进制

我们日常用的是十进制(0-9),但计算机内部所有数据(包括小数)都必须转换成二进制(0和1)存储。
对于整数(如123),十进制转二进制是“除2取余”,结果是有限的二进制数(比如123的二进制是1111011),可以精确存储。

小数的转换要复杂得多:十进制小数转二进制的方法是“乘2取整”,例如0.6789转二进制的过程是:

  • 0.6789 × 2 = 1.3578 → 取整数部分1(二进制小数第一位是1)
  • 剩下的0.3578 × 2 = 0.7156 → 取整数部分0(第二位是0)
  • 剩下的0.7156 × 2 = 1.4312 → 取整数部分1(第三位是1)
  • 剩下的0.4312 × 2 = 0.8624 → 取整数部分0(第四位是0)
  • … 以此类推

这个过程可能无限进行下去(永远无法得到整数1.0),就像十进制中1/3=0.3333…无限循环一样。
也就是说:大部分十进制小数无法用有限长度的二进制精确表示,只能得到一个近似值。

2. float类型的“存储空间”被严格限制

Java的float是32位单精度浮点数,遵循IEEE 754标准,它的存储空间被分成3部分:

  • 1位符号位(表示正负)
  • 8位指数位(表示数值的大小范围)
  • 23位尾数位(表示数值的精度,即有效数字)

关键限制在这里:尾数位只有23位(加上默认的1位隐藏位,总共24位有效精度)。
24位二进制能表示的有效数字相当于多少位十进制呢?
通过公式换算:24 × log₁₀(2) ≈ 7.2位。
也就是说:float最多只能精确表示6-7位十进制有效数字,超过这个范围的数字会被“舍入”,导致精度丢失。

3. 为什么123456.6789无法被float精确表示?

我们来看123456.6789的有效数字:
整数部分是123456(6位),小数部分是6789(4位),总共是10位有效数字(1-2-3-4-5-6-6-7-8-9)。

而float最多只能精确到7位有效数字,第8位及以后的数字无法精确存储,只能根据二进制转换规则进行“四舍五入”。

具体来说:
当你写float f = 123456.6789f时,计算机需要把123456.6789转换成二进制,但因为:

  • 小数部分0.6789的二进制是无限循环的
  • 尾数位只有23位,无法容纳全部二进制 digits

最终计算机只能存储一个“最接近123456.6789的二进制近似值”。当这个二进制近似值再转换回十进制时,就变成了123456.6796875(而不是原来的123456.6789)。

4. 一个更简单的类比

假设你有一个只能写7个数字的笔记本,现在要记录“123456789”(9个数字)。
因为本子空间不够,你只能记一个近似值,比如“123456800”(前7位保留,后面的四舍五入)。

float的问题和这个类比完全一样:它的“笔记本”(尾数位)只能放下相当于7位十进制的有效数字,对于123456.6789(10位有效数字),只能记录一个近似值。

三、总结

float无法精确表示123456.6789的核心原因是:

  1. 十进制小数转二进制时,大部分是无限循环的,无法用有限位数表示;
  2. float的尾数位只有23位(约7位十进制精度),无法容纳123456.6789的10位有效数字,只能存储近似值。

这也是为什么输出结果是123456.6796875——这是float能存储的最接近原始值的近似值。

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

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

相关文章

西安电子科技大学金融专硕复试线为325分,推荐报考!

西安电子科技大学的金融硕士专业,不仅依托银行、保险和证券三大子行业,强调数理分析与信息技术的融合,还拥有优越的就业前景和公平的招生政策,吸引了众多学子报考。西安电子科技大学西安电子科技大学“金融硕士专业”硕士点设立于…

阿里云创建自己的博客,部署wordpress

目录 1. 基础环境介绍与规划 1.1 操作系统 1.2 数据库环境 1.3 Web 服务器 1.4 PHP 环境 1.5 WordPress 应用环境 1.6 网络与安全 1.7 基础环境总览表 2.安装流程 2.1 准备环境 2.2 安装 MySQL 5.7 2.3 安装 PHP 及扩展 2.4 安装 Nginx(或 Apache&…

CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行上传产品信息和图片(6)

前几天已将基于开源CoreShop框架的微信小程序开启多租户功能,还开发了一个辅助客户端,已经完成了以下工作: 修改管理员表格,添加上所管理的店铺列表,两个产品信息表也全部加上所属店铺信息。 开发一个WPF客户端,能与服务器登录并能正常通信。尤其是添加了一个辅助类CoreH…

LabVIEW虚拟实验平台设计

​为突破实物实验教学的时空限制,解决实验设备不足、操作风险高等问题,设计基于专业软件的虚拟实验平台,以 “信号与系统” 无失真传输实验为实例,融合仿真与网络技术,适配高校工科实验教学,提升教学质量与…

PHP Composer 依赖管理完整指南 入门到精通

PHP Composer 依赖管理完整指南 入门到精通 Composer 改变了整个 PHP 开发生态,我用了 10 年,可以说它是 PHP 生态里最重要的工具,没有之一。不过我和 Composer 的关系一开始并不顺利——从刚接触时的一脸懵逼,到后来真正理解它的…

【开题答辩全过程】以 基于SpringBoot的校园一卡通管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

深度学习中常用的激活函数

参考文章: Activation Functions — All You Need To Know! | by Sukanya Bag | Analytics Vidhya | Medium 深度学习笔记:如何理解激活函数?(附常用激活函数) - 知乎 part-0_13.pdf 机器学习中的数学——激活函数&…

无恶意软件勒索:Storm-0501如何转向云原生攻击

Storm-0501基于云的勒索攻击链概览 | 图片来源:微软微软威胁情报部门最新研究显示,以经济利益为目的的威胁组织Storm-0501已将其勒索软件攻击模式从传统本地部署系统显著转向云原生攻击。报告警告称,该组织"持续优化攻击活动&#xff0c…

k8s--etcd

目录 静态pod 使用步骤: 关键特性说明: 常见使用场景: 案例: 环境变量 配置全景解析 实操:​​ 查看etcd集群节点信息 查看集群健康状态 数据库操作命令 增加(put) 查询(get) 删除(del) 租约命令 添加…

PowerPoint和WPS演示如何在放映PPT时用鼠标划重点

在播放PPT的时候,可以在屏幕上右键,在WPS演示中设置“墨迹画笔”为鼠标以外的其他笔形,在PowerPoint中设置指针选项为其他笔形,然后点击鼠标左键即可对屏幕上的内容进行标记。如果要退出,同样的路径操作取消鼠标形状即…

销售事业十年规划,并附上一套能帮助销售成长的「软件工具组合」

销售事业十年规划,并附上一套能帮助销售成长的 软件工具组合。这样你既有职业发展的路线图,也有日常可用的工具支撑。🔟 年销售事业规划 第1-2年:打基础目标:掌握销售流程,建立第一个客户池。重点&#xff…

如何在赛中完整的呈现数学建模模型

数模的完备性一直是国赛中评审的重点,也是大家赛中最容易失分的点。具体来讲,2023年C题国一使用了ARIMA,很多省三论文也是ARIMA。二者之所以出现这种巨大的等级差异不是因为模型问题,而是后者模型并不完备,缺少很多模型必要元素。…

蜂窝物联网模组:电动两轮车新国标实施下的关乎安全与智能化支撑

蜂窝物联网模组正成为电动两轮车新国标实施后不可或缺的关键部件,这一转变源于新国标对电动自行车安全性和智能化的强制性要求 。2025年9月1日起正式实施的GB17761—2024《电动自行车安全技术规范》不仅强化了防火阻燃、防篡改等安全标准,还首次将北斗定…

DevOps篇之利用Jenkins实现多K8S集群的版本发布

重点说明 在 Jenkins 中实现多 K8s 集群的版本发布与版本控制,核心在于解决集群身份认证、配置隔离、发布策略协调、版本统一追溯四大问题。以下是具体实现方案,结合工具链集成与流水线设计,确保多集群环境下的发布一致性与可控性。 一、核心…

Day16_【机器学习—KNN算法】

一、KNN 简介KNN:K-近邻算法 (K Nearest Neighbor)算法思想:一个样本最相似的 k 个样本中的大多数属于某一个类别,则该样本也属于这个类别距离计算:欧氏距离二、KNN 解决两类问题分类问题与回归问题分类流程…

《架构师手记:SpringCloud整合Nacos实战·一》

《架构师手记:SpringCloud整合Nacos实战一》 🌈 第一章:SpringCloud与Nacos的初识之旅 引言 在微服务架构的浪潮中,服务发现和配置管理成为了每个架构师必须面对的挑战。今天,我们将开启一段SpringCloud与Nacos的探…

卷积神经网络训练全攻略:从理论到实战

卷积神经网络(Convolutional Neural Networks, CNN)作为深度学习的重要分支,已成为计算机视觉领域的核心技术。从图像分类到目标检测,从人脸识别到医学影像分析,CNN 展现出了强大的特征提取和模式识别能力。本文将全面…

从零开始学习n8n-定时器+HTTP+飞书多维表格(上)

概述零基础也能把自动化玩明白:本篇将从“为什么要做自动化”出发,带你在 n8n 里新建第一个工作流,只用两个核心节点——Schedule Trigger(定时器) 与 HTTP Request。你会学会如何按固定频率触发流程、向接口发起请求、…

小白成长之路-k8s原理(二)

文章目录一、Service原理1.1概述1.2为什么需要service1.3service1.4service类型1.5service组件协同二、configMap原理2.1概述2.2命令2.3类型三、volume2.1emptydir2.2hostPath2.3pv/pvc2.4storageClass四、调度管理3.1概念3.2特点3.3亲和性3.4容忍和污点3.5固定节点调度五、etc…

2025 数字化转型期,值得关注的 10 项高价值证书解析

2025 年,数字化转型已迈入深度渗透阶段,大数据、人工智能、云计算等技术重塑各行业格局,相关领域人才缺口持续扩大。对于职场人突破瓶颈、大学生抢占就业先机而言,适配转型需求的专业证书已成为核心竞争力。本文结合行业经验&…