怎樣清楚excel的浮點誤差
『壹』 excel如何消除縮位後的計算誤差
有時我們輸入的數字是小數點後兩位數,但是在精度要求上只要一位,縮位後顯示沒問題,但其計算結果卻是有誤差的。解決方法是:單擊「工具→選項→重新計算」,選中「以顯示值為准」(),這樣計算結果就沒有誤差了。
事實上並不是計算上有誤差,而是顯示設置的四捨五入。採用本技巧提供的方法,可以解決顯示中的問題,但同時會改變數值的精度,在使用前Excel會給你一個警告。
『貳』 Excel 求教:單精度浮點型與雙精度浮點型的問題
求教,今天學習突然發現個問題,同樣的代碼,一個申明變數為單精度浮點型,一個申明變數為雙精度浮點型,但是結果卻不一樣
a=3.11999988555908
b=3.12
代碼:
Sub test2()
Const a As Single = 3.12
Const b As Double = 3.12
Range("A1") = a
Range("B1") = b
End Sub
結果在excel中如圖
這樣的話定義單精度浮點型不是沒用,以後小數不是都要定義為雙精度浮點型了嗎?
浮點數的誤差是一定存在,並且無法消除。
永遠不要直接比較兩個浮點數。比較的時候要先round。
把電腦中的浮點運算誤差找出來 - 任何人的電腦都會有這個誤差的
很多人在日常使用Excel,可能都沒有注意到浮點小數帶來的計算誤差問題
因為日常使用的運算結果,肯定都是四捨五入之後的結果,可以排除浮點誤差的影響
但是,浮點小數的誤差,也會出現在運算的過程,有可能導致最終結果出錯。
比方說 countif(A1:A10000,"=B1")這樣的簡單統計,也有可能出錯。
附件生成5萬個隨機小數(四捨五入到2位小數位),加上然後馬上減去同一個整數
對比計算前後的數值是否相等(數學上當然是絕對相等的,但是電腦的運算結果就不一定了。。。。。。)
附件會自動找出一批在你的電腦上會出現浮點小數誤差導致錯誤的運算。
出現浮點小數運算誤差的原因很簡單,小數有無窮多個
甚至一個小數也有無窮多位,如十進制的1/3,或者二進制的0.1
所以計算機存儲小數的時候,必定只能存儲所有小數的一部分,而無窮小數則必須截斷
因此,一個小數有時候就只能取一個接近值而不是精確值
而對應的浮點數運算,也只能得到接近值,而不是精確值
不同的CPU,比方說Intel的跟AMD的,或者奔騰跟賽揚,在硬體上對於截斷的位置是不一樣的
所以,同一個運算在不同的機器就可能有不同的結果
這也是為什麼論壇經常有人說xx運算不正確,然後回帖的人說我的機器沒事,其實就是CPU不同而已
另一方面,不同的軟體,內部計算的時候,也許用了不同的CPU硬體實現的數據類型,或者精度設置也不一樣,
所以,同一個運算在不同的軟體也可能有不同的結果
編程,寫公式要注意,假設 x,y 都是浮點數,er。。。。。。excel的每個小數單元格都是浮點數
那麼永遠不要寫 if x=y 這樣的句子,因為很可能數學上相等的x和y,在計算機內部是不等的
應該寫成 if |x-y| / max(|x|,|y|) <= 0.0000000000001 之類
或者簡單一點,用if round(x) = round(y) 來判斷,這樣最末一位的尾數浮點存儲誤差就不會影響整個數值了。
幸運的是,整數和定點小數不會受影響,編程時應該優先考慮使用整數和定點小數類型
另一方面,即使浮點小數可以完全表示我們要計算的數值,但是計算結果卻也有可能產生誤差
浮點,定點的意思是指小數點的位置
定點小數:小數點位置固定。
以十進制為例,假設一個數值類型可以有6個十進制位置,那麼定點類型無須記錄小數點位置,可以有以下類型:
整數類型,小數點位置就一定是個位後面,能夠表達的最精確數字就是1,能夠表達的范圍是 000000 - 999999
兩位小數類型,小數點位置就一定是百分位,能夠表達的最精確數字就是0.01,,能夠表達的范圍是 0000.00 - 9999.99
。。。。。。等等
浮點小數:小數點位置可以變動,並且需要額外的記錄去描述這個變動的小數點位置。
假設這里把其中一個位置用於記錄小數點位置(可變范圍 0-9),並且規定:
小數點位置取5,表示精度是1,小數點在個位後面,這個數值類型有0個小數位,可以表示 00000 到 99999 的數 (注意:這里只有5位有效數字)
小數點位置取6,表示精度是 0.1,小數點在十分位後面,這個數值類型有1個小數位,可以表示 0000.0 到 9999.9 的數
小數點位置取9,表示精度是 0.0001,小數點在萬分位後面,這個數值類型有4個小數位,可以表示 0.0000 到 9.9999 的數
......
小數點位置取4,表示精度是 10,表示小數點在十位,這個數值類型可以表示 00000 x 10 到 999990 的數,精度是 10
......
小數點位置取0,表示精度是 100000,表示小數點在十萬位,這個數值類型可以表示 00000 x 100000 到 9999900000 的數,精度是 100000
可見浮點小數通過可變的小數位置,使一個數值類型可以用一部分表示有效數字,另一部分表述每一單位有效數字的倍率
從而靈活地表示很大范圍的數值,代價是:由於用了一部分記錄內容去記錄小數點位置,所以有效數字的長度比定點小數要低。
而且,一些定點數運算不會出現的問題,在浮點數運算會出現
如兩個數相加
如果第一個浮點數是 100.01,第二個浮點數是 9999900000
按上述規則,這兩個都是合法的浮點數,可是它們的和 99999000100.01 卻無法用同一個浮點數類型表示出來。
一般計算機碰到這種情況,就會自動按比較大的數值來四捨五入,於是
100.01 + 9999900000 = 9999900000 (出現了100.01的誤差)
這也是浮點數誤差產生的一個原因:小的數值被大的數值「吸收」了。
要在Excel證明這一點就太簡單了,因為excel的double類型浮點小數只有15個有效數字(即最多記錄15個十進制數字)
所以Excel的單元格運算 12345012345678900000 + 12345.0123456789 = 12345012345678900000
-----------------------------------------------------------
VBA單精度浮點型Single與雙精度浮點型Double的區別
浮點型說白了就是科學記數法
單精度浮點型(single)
在C++中,單精度浮點型(float )專指佔用32位存儲空間的單精度(single-precision )值。單精度在一些處理器上比雙精度更快而且只佔用雙精度一半的空間,但是當值很大或很小的時候,它將變得不精確。當你需要小數部分並且對精度的要求不高時,單精度浮點型的變數是有用的。例如,當表示美元和分時,單精度浮點型是有用的。
在foxpro中,單精度浮點型是為了提供兼容性,浮點數據類型在功能上等價於數值型。
在VB中,Single 數據類型 Single(單精度浮點型)變數存儲為 IEEE 32 位(4 個位元組)浮點數值的形式,它的范圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38。6位有效位數
Single 的類型聲明字元為感嘆號 (!)。
雙精度(double)型
C語言中,雙精度(double)型佔8 個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
Single 最多可以顯示小數點後面7位 Double 最多可以顯示小數點後面14位
Single 數據類型
Single(單精度浮點型)變數存儲為 IEEE 32 位(4 個位元組)浮點數值的形式,它的范圍在負數的時候是從 -3.402823E38 到 -1.401298E-45,而在正數的時候是從 1.401298E-45 到 3.402823E38。Single 的類型聲明字元為感嘆號(!)。
Double 數據類型
Double(雙精度浮點型)變數存儲為 IEEE 64 位(8 個位元組)浮點數值的形式,它的范圍在負數的時候是從 -1.79769313486232E308 到 -4.94065645841247E-324,而正數的時候是從 4.94065645841247E-324 到 1.79769313486232E308。Double 的類型聲明字元是數字元號(#)。
『叄』 excel浮點運算誤差是怎麼回事麻煩幫忙解決下
將計算設置成
按顯示精度計算即可
不知道你什麼版本excel
不同版本設置位置不一樣
『肆』 怎麼消除浮點運算誤差
在進行數據計算時,小數也就是浮點數擁有不低的出場率。在常人看來,機器也就是計算機的數據運算是不會出錯的,沒錯,計算機進行數據運算的確不會犯錯,但小數運算的誤差是免不了的。
來試一試。
在JS中寫上console.log(0.3-0.1);輸出到控制台
0.3與0.1轉換為二進制的浮點數都是無限循環小數。但由於浮點數精度有限被強行截斷,所以轉回十進制輸出的數據會有誤差。
那麼如何解決這個問題。
最簡單的解決方案就是給出明確的精度要求,在返回值的過程中,計算機會自動四捨五入。
console.log((0.3-0.1).toFixed(2));//輸出的結果是0.20;
然而這樣子解決有點勉強。
再看下面的方法
var s = Math.pow(10,8);
console.log((0.3 * s - 0.1 * s)/s);
輸出後結果為0.2,沒有誤差。為什麼,上面是什麼意思。
原來為了避免產生精度差異,我們要把需要計算的數字乘以 10 的 n 次冪,換算成計算機能夠精確識別的整數,然後再除以 10 的 n 次冪,就能夠得到准確的結果了。
大部分編程語言都是這樣處理精度差異的,這里就借用過來處理一下 JS 中的浮點數精度誤差。
『伍』 請教下,如何解決excel數據透視表中出現的浮點誤差原因導致的數值顯示錯誤問題。
工具,選項,重新計算,「以顯示精度為准」
『陸』 Excel 怎麼去除EXCEL中的浮點誤差-Excel學習網
乍看之下,以下報告是一份普通報告。它僅按產品和地區對Excel表進行求和,然後對結果進行交叉計算。
報告的主體使用類似於所示單元格的公式…
F3:= SUMIFS(表格[值],表格[區域],$ E3,表格[產品],F $ 2)
… SUMIFS使用以下語法:
= SUMIFS(sum_range,criteria_range1,criteria1,criteria_range2,criteria2,...)
該報告的結構良好的版本會將測試添加到行和列的總計中,這些測試可確保報告不會忽略自上次生成報告以來添加到源數據中的新區域或產品。
但不幸的是,Excel的浮點數不準確會導致立足和跨立腳困難。
『柒』 EXCEL計算有誤是怎麼回事後面有那麼多小數點,數字是我手敲進去的
EXCEL中小數運算存在浮點誤差,這個與小數的存儲方式有關,是無法避免的。
並不是因為中間過程與手動輸入數據的關系,只是是小數運算就可能存在這種誤差,整數運算就不會有。
必要時,可以用顯示格式,設置小數位數,或者用ROUND函數四捨五入來修正。
『捌』 wpsexcel消除公式浮點運算誤差
一是盡可能使用加法而不是使用減法,會很少受浮點運算誤差的影響
二是可採用ROUND之類的數據截取,一般這個誤差是很小很小的,小數位數在8位以上的,所以,只要四舍五十截取前面幾位數,就可以消除這個誤差了……
『玖』 Excel 求教用VBA解決浮點誤差
原因:這是由於浮點運算造成的。(在微軟官方有詳細說明的)
(0.65)10 = (0.......)2(0.6) 10 = (0.......)2
目前計算機上存儲浮點數值是按照IEEE(電氣和電子工程師協會)754浮點存儲格式標准來存儲的。IEEE單精度浮點格式共32位,包含三個構成欄位:23位小數f,8位偏置指數e,1位符號s。將這些欄位連續存放在一個32位字里,並對其進行編碼。其中0:22位包含23位的小數f; 23:30位包含8位指數e;第31位包含符號s。也就是說上面將0.65及0.5轉換出的二進制代碼,我們只能存儲23位,即使數據類型為double,也只能存儲52位,這樣大家便能看出問題出現的原因了。
截取的二進制代碼已無法正確表示0.65及0.5,根據這個二進制代碼肯定無法正確得到結果0.05。
在Excel進行計算時在計算機中是轉換成二進制進算然後保留數值的,所以會出現誤差。
方法一:
將原公式利用round()函數將其保留固定的小數位。
方法二:
工具----選項----重新計算---勾選【以顯示精度為准】