2014-09-25 16 views
10

Hai số dài này giống nhau trừ số cuối cùng.Làm thế nào để ngừng cắt ngắn các số cắt dài

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

nhưng chữ số cuối cùng bị mất khi những con số được đưa vào mảng:

unique(test) 

ans = 3.3777e+16 

Làm thế nào tôi có thể ngăn chặn điều này? Các con số là mã ID và mất chữ số cuối cùng là vặn mọi thứ lên.

+2

là chúng * chỉ được sử dụng làm mã ID * và * không có thao tác số học nào được thực hiện trên chúng? nếu lưu trữ như một chuỗi có thể là một lựa chọn tốt hơn ... – RTL

+0

Tôi đã thử nhưng tôi nhận được một vấn đề tương tự, num2str cắt giảm chữ số cuối cùng. – Lefti

+3

Nhập '' eps (kiểm tra (1)) '' trả về '' 4''. Điều này có nghĩa là số phân biệt lớn hơn tiếp theo từ '' test (1) '' là '' test (1) + 4''. Bạn có thể xác minh bằng '' length (unique ([test, test (1) +4])) '' return '' 2''. Tôi tin rằng bạn không thể giải quyết vấn đề này bằng cách sử dụng số mặc định, nhưng thay vì đọc (hoặc đầu vào) id là chuỗi. – Nras

Trả lời

13

Matlab sử dụng biểu diễn dấu phẩy động 64 bit theo mặc định cho số. Chúng có độ chính xác 16 chữ số cơ sở (nhiều hơn hoặc ít hơn) và số của bạn dường như vượt quá mức đó.

Sử dụng một cái gì đó giống như uint64 để lưu trữ số của bạn:

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

Đây thực sự là một lỗi làm tròn, không phải là một lỗi hiển thị. Để có được các chuỗi chính xác cho các mục đích đầu ra, hãy sử dụng int2str, bởi vì, một lần nữa, num2str sử dụng một biểu diễn dấu phẩy động 64-bit và có lỗi làm tròn trong trường hợp này.

+0

Chạy '' num2str (kiểm tra) '' với đầu vào đơn vị64 của bạn trả về các chuỗi mong muốn. – Nras

+0

Chỉ muốn kêu gọi để nói rằng nó không thực sự là một lỗi làm tròn * cho mỗi *, đó là một giới hạn nội tại của đại diện điểm nổi. Tiêu chuẩn điểm nổi không thể đại diện cho sự khác biệt nhỏ như vậy giữa hai con số của độ lớn đó. –

+0

Cảm ơn uint64 là những gì tôi cần. – Lefti

Các vấn đề liên quan