2014-09-25 49 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