2012-04-05 26 views
6

Tôi có giá trị TDateTime (mà tôi nhận được từ kết quả là EndOfTheMonth(date)) thành loại biến thể. Kết quả được làm tròn sai. Hãy xem ví dụ:Chuyển đổi không hợp lệ từ EndOfTheMonth (ngày) thành Giá trị biến thể

data := EndOfTheMonth(date); 
    V := data; 
    ShowMessage(DateTimeToStr(data) + ' vs ' + VarToStr(V)); 
// output is 
// data = 2012-01-31 23:59:59 
// v = 2012-02-01   // why next day? 

Hành vi được thiết kế? Làm thế nào để giải quyết vấn đề này?

Trả lời

6
ShowMessage(DateTimeToStr(data) + ' vs ' + DateTimeToStr(VarToDateTime(V))); 

Cập nhật: tôi sẽ đoán vấn đề là các phần nghìn giây cuối cùng của tháng là rất gần 00:00:00 ngày hôm sau, có nghĩa là, giá trị TDateTime (mà về cơ bản là một double) rất gần với một số nguyên (ví dụ: 41029.9999999884 rất gần với 41029) và do đó hàm VarToStr giả định số thập phân là số fuzz.

+2

'DateTimeToStr (V)' cũng hiển thị kết quả chính xác. Rõ ràng, vấn đề là với hàm 'VarToStr()'. –

+0

http://www.devexpress.com/Support/Center/p/B223005.aspx để chúng sai? – JustMe

+2

@AndriyM: Đúng, nhưng không bao giờ (?) Sai quá rõ ràng! :) –

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