1. 程式人生 > >理解int轉float為何會可能精度丟失的問題

理解int轉float為何會可能精度丟失的問題

         在看Java核心技術卷I的時候,看到個基礎型別轉換,圖片就不附上了,上面寫到int轉float有可能會精度丟失,看到此處的時候我一直在疑惑,明明float能夠表示的數比int要大得多,怎麼可能int轉到float的時候會精度丟失呢???原諒我是個小菜鳥。

         第二天回到公司與同事幾乎研究了一早上,最後發現主要實際上是int和float的儲存結構是不同的。

         曾在百度上搜到一個很形象的答覆,就是int是準確值,而float是精確值,準確轉精確當然會精度丟失。

         Int是4位元組32位來表示的,而float雖然也是4位元組32位,但是float的儲存結構是很不一樣的

 

         以這一例子來說明,由圖可知,float的儲存結構是1個符號位,8個指數位,23個尾數。

符號位,表述浮點數的正或者負,0代表正,1代表負。

指數位,實際也是有正負的,但是沒有單獨的符號位,在計算機的世界裡,進位都是二進位制的,指數表示的也是2的N次冪,8位指數表達的範圍是0到255,而對應的實際的指數是-127到128。也就是說實際的指數等於指數位表示的數值減127。這裡特殊說明,-127和+128這兩個指數數值在IEEE當中是保留的用作多種用途的,這裡就不多做介紹了,有興趣的可以查閱其他資料。

尾數位,只代表了二進位制的小數點後的部分,小數點前的那位被省略了,當指數位全部為0時省略的是0否則省略的是1。

由此我們可以明白,實際上尾數確定了浮點數的精度,而數的大小主要是靠指數位,尾數只有23位,加上省略的那一位便是24位,所以如果int型別的值在2^24以內,float是可以精確表示的,但是當超過這個數的時候就不一定能精確表示了。這裡最重要的一點便是要理解確定精度的有效位數,不管是什麼基本型別轉換實際上都要明白這一點。就如我此博文講的intfloat,都是32位,但是記憶體結構既儲存結構是不一樣的,float只能有24位來確定精度,而int32位。其他型別也如此進行理解即可。

接下來講解一下上面的公式理解:::

在講這公式之前講一下我在理解過程中遇到的難題,就是尾數的23位值為什麼是介於1.0和2.0之間,當時看到一直想不明白,後來才瞭解到這

23位是用來表示小數位的,而省略的那一位是1,因為0是沒有意義的(因為如果是0,一個小數的不管乘以多少都是小數)。再次強調這裡的尾數23位是表示小數位的。

 

再次貼一下圖片。。

就以圖的例子來講。

符號位我想不用我講了

指數位就跟我們算十進位制一樣的方法,可以算出指數位是124(演算法我就不在這裡說了,網上自己查一下),套入以上的表示式的最後一個,既是2^(124-127) = 2^(-3)

然後尾數部分,看它的公式就可以看出來,b23-i就是尾數部分的哪一位數,i取1的時候就b22,既最左邊的部分,然後再乘以2的負i次方。從上面這一公式也可以看出,尾數部分是介於1.0和2.0之間。

最後3個部分相乘就得出正確的結果了。

PS:第一次寫部落格,可能寫的不太好,希望大家見諒,上面的內容部分是轉載的,也有可能有地方出錯了,歡迎大家指出,謝謝。

相關推薦

理解intfloat為何可能精度丟失的問題

         在看Java核心技術卷I的時候,看到個基礎型別轉換,圖片就不附上了,上面寫到int轉float有可能會精度丟失,看到此處的時候我一直在疑惑,明明float能夠表示的數比int要大得多,怎麼可能int轉到float的時候會精度丟失呢???原諒我是個小菜鳥。

後端將Long型別的資料傳給前端,前端可能出現精度丟失的情況及其解決方案

1.問題描述: 後端將long型別資料傳給前端,前端解析時可能出現精度丟失的情況. 例如:後端資料:919059760869863424,到前端變成919059760869863400;又或如:918806410454654976--->918806410454654900表現為

浮點型運算結果是不精確的,出現精度丟失

float a = 1.1f; float b = 3.1415926f; //輸出結果3.1415925 精度丟失 double b=1.1d; double result = a+b; //結果是2.200000023841858 精度丟失 解析: 第

【GreenDao學習筆記】SQLite資料庫儲存float/double小數型別精度丟失

       用GreenDao工具來操作資料庫明顯提高了開發效率,但是也會出現一些小問題,比如儲存小數的時候,加加減減總無可避免精度不準,SQLite的資料型別只有這麼幾種(參考:https://www.sqlite.org/datatype3.html)。BigDecim

Mysql中int型別強制插入float發生什麼(nctf中web ,mysql)

首先建立一個表A,只有一個列,就是a,型別設定為int create table A(a int); 然後強制插入資料5.1和5.5 insert into A values(5.1); insert into A values(5.5); 然後查詢,select * from A;

Unity,C# floatString如何保留實際小數位數,即防止精度丟失擷取字串報錯

比如一個float a = 329.0; 轉成String,要讓a顯示成329.0;如果a = 329.000,轉成String 顯示成329.000 可是實際卻不是這樣的 a.ToString()直接變成329 所以碰到這種情況怎麼辦呢 一. string Dat

intfloat深入理解

別在int與float上栽跟頭 int與float是我們每天程式設計都用的兩種型別,但是我們真的足夠了解它們嗎。昨天在部落格園看到一個比較老的笑話: “昨天晚上下班回家,一民警迎面巡邏而來。突然對我大喊:站住!民警:int 型別佔幾個位元組?  我:4 個。  民警:你可

pandas string格式intfloat

如果y1的 amount列是string格式的 y1 = pd.to_numeric(y1.amount, errors=’ignore’ )/10000 errors=’coerce’, 會返回nan,these errors will be ignore

float,double等精度丟失問題

idt multipl sof zh-cn hid lose 減法 add hide 問題提出:   12.0f-11.9f = 0.10000038,"減不盡"為什麽?   8888.88*100 = 888887.9999999999 ??? 來自MSDN的解釋:h

SpringMVC3.2 解決PO返回前臺成JSON時數據Long精度丟失問題

service extends object adapter pen ring opened strings gad SpringMVC3.2 解決PO返回前臺轉成JSON時數據Long精度丟失問題 方案 1、自定義一個傑克遜的json轉換類 public c

Ubuntu下int字符串

int轉換成字符串# include <stdio.h> # include <stdlib.h> void main (void) { int num = 100; char str[25]; sprintf(str,"%d",num); printf("The number ‘nu

java intString全部方式的效率對照與深入解析

表達 comm 個數 第一個 另一個 alt lock his ng-   在java中,大家肯定都會遇到int類型轉String類型的情形,知其然知其所以然。總結加分析一下,int類型轉String類型有下面幾種方式:  a+”“String.valu

Vue2.0 探索之路——生命周期和鉤子函數的一些理解

head chrom 路由 技術分享 defined 修改 疑問 reat 有時 前言 在使用vue一個多禮拜後,感覺現在還停留在初級階段,雖然知道怎麽和後端做數據交互,但是對於mounted這個掛載還不是很清楚的。放大之,對vue的生命周期不甚了解。只知道簡單的使用,而不

scala中計算的的一個小問題,超出Int.maxValue時不報錯

class sca cal div 問題 pri 如果 int sin 如果小於Int.max時他不會報錯 def sumcount(str:String): Int ={ val ints = for(c <- str)yield { p

更改Windows Update設置時,為何提示“某些設置由你的系統管理員管理”?

http window con 備份 計算機 list alt+ text 應該 親測有效 及時進行更新是保證系統正常運行的一個有效措施。可為什麽當我們進入“控制面板->Windows Update”手動修改 Windows Update 的設

FreeMarker 的空值處理 , 簡單理解 , 不用TMD就忘記

mark bool 顯示 空字符 marker freemark 返回 後者 als NO.1  而對於FreeMarker來說,null值和不存在的變量是完全一樣的 NO.2  !        指定缺失變量的默認值      返回String NO.3  ??     

矩陣乘法的理解

導致 ebr tle 就會 ice 大學 img 很多 所有 大多數人在高中,或者大學低年級,都上過一門課《線性代數》。這門課其實是教矩陣。 剛學的時候,還蠻簡單的,矩陣加法就是相同位置的數字加一下。 矩陣減法也類似。 矩陣乘以一個常數,就是所有位置都乘以這個數。

OpenCV中對Mat裏面depth,dims,channels,step,data,elemSize和數據地址計算的理解

ima 忽略 learning note 數組 進行 每一個 ber 初始 cv::Matdepth/dims/channels/step/data/elemSizeThe class Mat represents an n-dimensional dense numeri

java中IntegerFloat總結

style tostring span eof del 類型 () big color 一.先將Integer轉化成int類型,在強制轉float類型 例:Integer str = new Integer(20); int i = str.intValue();

Spring中AOP的一個通俗易懂的理解

學會 事物 nbsp 連接 新的 之前 天都 這不 proxy 這是看到的一個最易懂得AOP簡介了,適合初學者理解。 轉自:http://www.verydemo.com/demo_c143_i20837.html 1.我所知道的aop   初看aop,上來就是一大堆術語,