java中的float和double的精度問題


此文解釋了為何float的范圍比int大(同樣4字節),但有些int是float無法正確表達的(精度丟失)


java中的float和double的精度問題

 

1、背景知識 
在java中沒有細講,只是講了float占32位(bit),double占 64位。 
對於計算機來說,用位數表示是合適的。但有人喜歡用字節(byte)表示。一個字節占8位。 
1 byte = 8 bit. 
所以float占4個字節,double占8個字節。 
不過我還是喜歡用位數表示。這樣更直接,也更容易理解計算機是怎么存儲這些類型的。 

對於精度和范圍,還是參考一下c++吧。 


2、存儲知識 
計算器存儲浮點數的方法:(用科學計數法存儲) 
將要存的數先轉換為小數(0.xxxxxx)x10的n次冪的形式進行存儲。 
例如: 
3.1415 將被轉換為:0.31415 x 10^1 
100000 將被轉換為:0.1 x 10^6 

首先申明一點,先范圍(有效數字位,包括整數位和小數位),再精度。 


3、下面切入正題 
===================== 
在c++中單精度float類型與雙精度double類型的問題 

【"單精度用float表示,在計算機中使用4位字節(32位bit)來表示,具有7位有效數字"】 

float類型存儲的時候1個bit是符號位,8個bit是指數位,剩下的23個bit是有效數字位。 
2的23次方是8388608,即7位有效數字,精度(10進制)。 

一個單精度的浮點數在內存當中占用了32個bit位,按照浮點數的表示標准,最高位表示符號,這32位一部分用來表示階碼,一部分用來表示小數部分。 
按照這個表示方法轉化成10進制之后,它能表示的最高精度是7位有效數字。 

比如 
float a=3.14159;a在內存中實際上表示為0.314159乘以10的1次方(0是符號位),而分配給a的存儲單元就分為兩部分,一部分存0.314159,一部分存指數1,而且也都是轉化為2進制來存。 

================== 
float ,1位符號位, 8位指數位,23位尾數位 
double,1位符號位,11位指數位,52位尾數位 

float尾數位23位,2^23=8.3E6,7位,所以不同的編譯器規定不同,有些是7位,有些8位 
double尾數52位,2^52=4.5E15,15位,所以double的有效位數是15位 


后記: 
數一下有效數字位數(整數位+小數位),7位以內的用float,15位以內的用double 
但是還有一點小小的區別: 
float f =  (float) 62345678.912345;  // => 6.234568E7  共 7 位 
float f2 =  (float) 12345678.912345; // => 1.2345679E7 共 8 位 

(精度問題,float精度為7--8位,8位的情況是第一位是1,當是2時進位后面的精度丟失?)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM