2012-02-03 27 views
66

FmtBcd.pas đã được sửa đổi rộng rãi được viết lại trong Delphi XE2. Trong một dự án của tôi, tôi có một trường hợp sử dụng phép toán phân chia trên hai giá trị Bcd, nhưng hai phiên bản mang lại kết quả khác nhau. Trong trường hợp xấu nhất, các Delphi XE2 có thể ném một Bcd overflow error.Chức năng BcdDivide hoạt động khác nhau trong Delphi XE và XE2

Ví dụ: Chạy đoạn mã sau vào Delphi XE2 console ứng dụng:

var A, B, C, D: TBcd; 
begin 
    A := StrToBcd('1'); 
    B := StrToBcd('3'); 
    BcdDivide(A, B, C); 
    WriteLn(BcdToStr(C)); 

    try 
    BcdMultiply(C, C, D); 
    WriteLn(BcdToStr(D)); 
    except 
    on E: Exception do 
     WriteLn(E.Message); 
    end; 

    ReadLn; 
end. 

Output những điều trên sẽ là:

0.333333333333333333333333333333333333333333333333333333333333333 
BCD overflow 

Biến C chứa một giá trị BCD với 63 chữ số thập phân của đặc hiệu . Thực hiện thao tác BcdMultiply thứ hai trên biến C sẽ gây ra một Bcd overflow error.

Tuy nhiên, để chạy cùng mã trong Delphi XE mang lại kết quả sau đây mà không bất kỳ dấu nhắc ngoại lệ:

0.3333333333 
0.11111111108888888889 

thể bất cứ ai xin đề nghị một phương pháp thực hành tốt nhất để giải quyết vấn đề này?

+4

Khó nói bất cứ điều gì khác ngoại trừ việc đây là lỗi trong XE2. –

+8

Tôi đã báo cáo cho http://qc.embarcadero.com/wc/qcmain.aspx?d=103106 –

+1

Kết quả tương tự khi được biên soạn cho Win32 hoặc Win64? –

Trả lời

5

Mã trong câu hỏi tạo ra kết quả mong đợi trong bản cập nhật XE2 4. Lưu ý rằng bản cập nhật 3 sẽ tạo ra kết quả xấu và do đó sửa lỗi đến với bản cập nhật 4. Ngoài ra, XE3 tạo ra kết quả mong đợi.

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