2014-09-25 48 views
10

除了最後一位數字,這兩個長數字是相同的。如何停止matlab截斷長數字

test = []; test(1) = 33777100285870080; test(2) = 33777100285870082;

但是當數被放在數組中的最後一位丟失:

unique(test) 

ans = 3.3777e+16 

我如何避免這種情況?這些號碼是身份證號碼,丟失最後一位數字就是搞砸了一切。

+2

他們*只是作爲ID碼*和*是否沒有算術運算*對他們做?如果這樣存儲爲一個字符串可能是一個更好的選擇... – RTL 2014-09-25 12:35:13

+0

我試過,但我得到了類似的問題,num2str切斷了最後一位數字。 – Lefti 2014-09-25 12:47:34

+3

鍵入''eps(test(1))''返回''4''。這意味着下一個更大的可區分的數字與''test(1)''是'test(1)+ 4''。你可以通過''length(unique([test,test(1)+4]))''''''''''2''來驗證。我相信你不能使用默認數字來解決這個問題,而是將這個id作爲字符串讀取(或輸入)。 – Nras 2014-09-25 13:03:25

回答

13

Matlab默認使用64位浮點數來表示數字。那些基數爲10 16位精度(或多或少),你的數字似乎超過了這個數字。

使用類似uint64來存儲你的號碼:

> test = [uint64(33777100285870080); uint64(33777100285870082)]; 
> disp(test(1)); 
    33777100285870080 
> disp(test(2)); 
    33777100285870082 

這確實是一個舍入誤差,而不是顯示錯誤。要獲得正確的輸出用字符串,請使用int2str,因爲再次,num2str使用64位浮點表示法,並且在這種情況下出現舍入錯誤。

+0

用你的unit64輸入運行''num2str(test)''返回所需的字符串。 – Nras 2014-09-25 13:09:23

+0

只是想要說出它不是一個真正的舍入錯誤*本身*,它是浮點表示的內在限制。浮點標準不能代表兩個數量級之間的這樣一個小的差異。 – 2014-09-25 13:09:37

+0

謝謝uint64是我需要的。 – Lefti 2014-09-25 13:26:10