2016-03-19 37 views
5

Tôi gặp sự cố khi so sánh hai biến "Loại thực". Một là kết quả của phép toán, được lưu trữ trong tập dữ liệu, thứ hai là giá trị của trường chỉnh sửa trong biểu mẫu, được chuyển đổi bởi StrToFloat và được lưu vào biến "Real". Vấn đề là thế này: 121,97 not equal to 121,97Delphi - so sánh hai biến số "Thực"

Như bạn có thể thấy, các chương trình đang cố gắng cho tôi biết, rằng 121,97 không bằng 121,97 ... Tôi đã đọc this topic, và tôi không chắc chắn copletely , đó là cùng một vấn đề. Nếu đúng như vậy, sẽ không phải cả hai số được lưu trữ trong các biến số giống như một số có thể biểu thị chính xác gần nhất, cho số 121.97 là 121.96999 99999 99998 86313 16227 83839 70260 62011 71875?

Bây giờ, giả sử chúng không được lưu trữ dưới dạng số có thể đại diện gần nhất. Làm cách nào để tìm chính xác cách chúng được lưu trữ? Khi tôi nhìn vào cửa sổ gỡ lỗi "CPU", tôi hoàn toàn bị mất. Tôi thấy các địa chỉ, nơi mà những giá trị nên được, nhưng không có gì thậm chí tương tự như một số nhị phân, hệ thập lục phân hoặc bất cứ ... Điện thoại:

Sửa: hai giá trị đó thực sự hơi khác nhau.

enter image description here

OK, tôi không cần phải hiểu mọi thứ. Mặc dù tôi không giải quyết bằng tiền, sẽ có tối đa 3 chữ số thập phân, vì vậy "tiền tệ" là lối thoát

BTW: Việc tính toán là:

DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat; 

Trong trường hợp này nó là 3695-3573,03

+0

Xem JIRA RSP-13792. Bạn có thể muốn gọi hàm 'comparevalue'. – Magoo

+2

@Magoo Báo cáo đó là không có thật. Trình biên dịch hoạt động chính xác. –

+1

'StrToFloat' sẽ hoạt động như bạn nói.Nhưng còn giá trị khác thì sao? Nó được tính như thế nào. Tôi nghĩ bạn nên tập trung vào vấn đề thực tế mà chúng ta không thể thấy được. –

Trả lời

9

Vì lý do không xác định, bạn không thể xem giá trị float (đơn/đôi hoặc real48) dưới dạng thập lục phân trong danh sách theo dõi.

Tuy nhiên, bạn vẫn có thể xem biểu diễn thập lục phân bằng cách xem nó dưới dạng kết xuất bộ nhớ.
Đây là cách thực hiện: Thêm biến vào danh sách theo dõi.
Nhấp chuột phải vào đồng hồ -> Chỉnh sửa Xem ...
Xem nó như memory dump

enter image description here

Bây giờ bạn có thể so sánh hai giá trị trong chương trình gỡ rối.

Không bao giờ sử dụng phao cho số tiền tiền lẻ
Bạn biết tất nhiên là bạn không nên sử dụng phao để đếm tiền.
Bạn sẽ gặp nhiều rắc rối với làm tròn và so sánh sẽ không hoạt động theo cách bạn muốn.
Thay vào đó, nếu bạn muốn sử dụng loại tiền currency. Nó không có những vấn đề này, hỗ trợ 4 chữ số thập phân và có thể được so sánh bằng cách sử dụng toán tử = không có vấn đề làm tròn.

Trong cơ sở dữ liệu của bạn, bạn sử dụng kiểu dữ liệu money hoặc currency.

+0

Bạn có thể trong nhiều trường hợp so sánh nổi cho sự bình đẳng –

+0

Có, nhưng không phải khi bạn đang làm việc với tiền. Đã cập nhật câu trả lời. Trừ khi bạn biết chính xác những gì bạn đang làm so sánh bình đẳng với phao nổi là một công thức cho thảm họa – Johan

+0

Cảm ơn bạn! Nó sẽ có thể mô tả ngắn gọn những gì tôi đang nhìn vào trong bãi chứa bộ nhớ? Tôi xin lỗi để nói, nhưng tôi đã không được thành công tại figuring ra ... Tôi có nghĩa là - hexadecimal đại diện của 121.97 là 0x42f3f0a4 ... –