標籤:

Excel 計算結果莫名多出很多位小數,據說是浮點誤差?

事情是這樣的,一個好好的 Excel 工作表格因為一個小數位數的問題糾結了我一整天,全網沒有搜出解決方案,來知乎尋求大牛幫助:

表格下面有個 3.23 是我上面的「期末餘額」處的「3」通過「複製-選擇性粘貼-數值」得到的,如果他的顯示結果是 3.23 也就沒有什麼問題了,可是可是,可是是是是點開 3.23 來看,也就是 Excel 表格最上面的輸入框的顯示數值是 3.23000000000002 啊!我上面的都是通過 round 函數得到的兩位小數數值啊,怎麼會出現那個神奇的 0.000000000002 呢!

於是,我是糾結啊,我就把E列是所有內容都清空了,包括公式,然後一個個一個個單元格來找原因啊,輸入一個數,查看一下小數位數,終於,功夫不負有心人,讓我找到了,是關聯方借款那一行的「20」搞的鬼啊,如果不輸入「20」完全沒有問題啊!出來的效果是這樣子的:

也就是這張圖的 16.77,這是一個正常的 16.77.

然後我就抱著試試看的態度在關聯方借款「20」輸入框那裡輸入「1」,「5」,「50」,「100」等等都是得到的是正常兩位小數的一個數字,但是當我輸入「10」,「20」等數的時候出來的就是帶 0.0000000000000002 的數啊,這到底是怎麼個情況啊!

網上說在工具-選項-勾選顯示精確值,還是沒有解決,網上還說是浮點運算造成的誤差,可是不想要這個誤差啊,而且不明的是這麼簡單的幾個數運算得到的數字為什麼還存在誤差呢?

求大神幫忙解決,萬分感謝!


謝謝邀請。

你可能會覺得,Excel這麼強大的電子表格軟體,居然連一些簡單的加減法都計算不正確,

比如:

在單元格輸入=42-41.7,計算結果居然不是0.3,而是0.299999999999997。

在單元格輸入=(43.1-43.2)+1,計算結果也不是0.9,而是0.899999999999999。

嗯,是的,Excel有時候就是做不了簡單的算術。

不要奇怪,也不要莫名驚詫,Excel就是這麼任性。

還有更奇怪的,Excel連你手工輸入的數字都會弄錯。

不信?

你在單元格輸入39524.848、55556.848、65535.848看看。

是不是小數點後的848變成了8479999999?

這是搞的什麼鬼?

這是浮點計算引起的誤差

這很常見,也並不奇怪。

走的夜路多了,自然會碰到鬼,你用久了電子表格,肯定會遇到這種情況。

為什麼會這樣?

由於Excel是採取二進位存儲數字的(在Excel中浮點數分為三個部分,總長度為 65 位:符號、指數和尾數)。而某些十進位的有窮非循環數在二進位下是無窮的循環數,比如0.1。雖然這些數字在以 10 為底的情況下可以完美地表示,但相同數字在二進位格式下,在尾數中存儲時就變成了以下二進位循環數字:

000110011001100110011(等類似數字)

Excel在儲存這些數字時,它在尾數中只存儲能夠容納的部分,並截斷其餘部分。這導致在存儲數字時產生大約 -2.8E-17 或 0.000000000000000028 的誤差。

這個道理就象在十進位下無法準確地表示1/3一樣,只能用循環小數 0.33333333333333333333來近似表示。

遇到這種情況怎麼辦?

遇到這種情況,有二種解決方案:

方案一:在公式中加round來四捨五入。

方案二:使用「將精度設為所顯示的精度」選項。但是此選項要謹慎使用,會影響本工作簿所有的數值。

詳細情況可參見

https://support.microsoft.com/zh-cn/kb/78113#/zh-cn/kb/78113


Excel也會算錯數?

在Excel里計算(4.1-4.2)+1=?如果現在打開了電腦的小夥伴,可以馬上試一試,或許你會說:結果沒錯呀,等於0.9

其實,你被Excel欺騙了,馬上設置保留15位小數,讓結果現出原形吧。

是不是驚呆了,聰明絕頂的Excel竟然連這麼簡單的計算題都不會?

其實,存在無數種簡單的算式,Excel都是算不出來的,比如:(4.1-4.2)+1=0.899999999999999

別說算式,有些數據在Excel裡面根本是無法輸入的。不信?你試一下在單元格里輸入65535.848,再設置單元格讓它現出真身,竟然是65535.8479999999

原因分析

在計算機里,這樣的例子是很常見的,分析原因有二

  • 一類是「四捨五入」造成的

Exce中顯示的數字與實際小數位數不一致,就會出現下圖這樣的低級錯誤

上圖中,數據是以默認的保留2位小數顯示,如果設置保留3位小數,原因就原形畢露了

  • 第二類是由「浮點運算」造成的

什麼是「浮點運算」呢?其實大學的時候高等數學和計算機原理裡面是講過的,不過毫無疑問,自習君把知識還給老師了。

簡單而言,因為計算機採用的是二進位,有時候,二進位無法準確地表達十進位的數,是無窮的數,而計算機只儲存有限的位數,從而產生了誤差。

這類似於1/3 在十進位下無法得到準確表示(循環小數 0.3333333333……),若要顯示成小數就只能顯示最接近的3.33,從而產生了0.0033……的誤差。

三種方法解決問題

要使Excel自動求和結果與手工計算結果一致,我們就必須要保證:Excel顯示的數值就是實際數值。如何來保證呢?自習君教大家3種辦法:

1、 用函數round進行四捨五入

舉例:如在A1單元格輸入3.1415,我們在B1輸入公式=ROUND(A1,2),則顯示為3.14;若輸入=ROUND(A1,3) ,則顯示為3.142

使用該函數後單元格顯示的數據就是真實的數據,再運算,就不會出現電腦與手工結果不一致的情況

2、 將單元格複製到記事本(txt),再複製回excel即可(推薦使用)

因為記事本所見既是真實內容,固可達到函數round的效果

3、 在Excel選項中設置 「以顯示精度為準」

此選項會強制將工作表中每個數字的值成為顯示的值。

此選項影響該工作簿的所有工作表,會造成原始數據的丟失且無法恢復,一般不建議使用或使用前備份原始數據。


我遇到相同的問題,我用的office2010 ,也遇到同樣的問題了!!

不要再說什麼數據格式問題,我數據格式沒問題的!!=IMSUB(K3,L3) ---減法函數

以下網上的方法都不行,無法解決:

1、再讓你們看看最詭異的事情!!

同樣一批數據,格式完全一致,有的正常有的異常!!

2、配置精度選項--沒有用

******

最後、round轉換搞定:=ROUND(IMSUB(K2,L2),2)

我只想問,微軟的工程師能上知乎嗎?

趕快解決下這類千年大bug吧!!!!!


跟0.1+0.2=0.30000000000000004一樣


感謝,學到了


還是知乎上大神多,之前在百度找了好久的問題,回答都是路唇不對馬嘴,解決的都是最基本的問題,沒有從根本上解決我的疑惑,看了這個帖子,瞬間明朗了!!!


這種問題還是上附件的比較好


推薦閱讀:

怎樣把excel題庫轉成word?
excel 中如何實現數字位置的調整?
在EXCEL中使用VLOOKUP函數時,為什麼會出現數據分明存在,卻依然反饋N#A的情況?
同一文件夾下如何批量列印所有EXCEL工作簿中的指定的幾個工作表?
學習excle有啥方法?

TAG:Excel使用 |