【筆記】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
英文地址,請注明出處:http://en.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 年,數字化轉型已邁入深度滲透階段,大數據、人工智能、云計算等技術重塑各行業格局,相關領域人才缺口持續擴大。對于職場人突破瓶頸、大學生搶占就業先機而言,適配轉型需求的專業證書已成為核心競爭力。本文結合行業經驗&…