Những vấn đề với tính toán dấu chấm động

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,121
Được thích
24,279
Các bạn thử vào xem và kiểm tra lại xem sao:

Bấm vào

Kết quả như thế nào vậy? -+*/
 
Đã bạn nào thử chưa vậy? Kết quả như thế nào post lên nhé. Cám ơn.
 
Lỗi này tôi đã phát hiện từ cách đây 1,5 năm. Tuy nhiên khi cài SP6 của bộ Visual Studio 6 lên thì ko sảy ra lỗi này nữa.

(Sorry, lúc nãy test nhầm code tưởng là SP6 đã giải quyết được). Trước kia phát hiện ra lỗi nhưng chỉ đoán là M$ đã sai gì đó đối với kiểu Double và sau đó dùng VAL() trước các biểu thức so sánh là xong.
 
Lần chỉnh sửa cuối:
Cách xử lý như thế nào hả bác ?
 
PhanTuHuong đã viết:
Cách xử lý như thế nào hả bác ?

Lỗi này có thể là ... nằm trong lõi của hệ điều hành của MS do chuyện dấu phảy động. Chả có cách nào giải quyết cả đâu. Sorry là tớ nhầm là có thể giải quyết bằng bộ SP6.

Mã:
Dim a As Double, b As Double, s As Double
a = 0.11
b = 0.1
s = 0.21

If s = a + b Then
   MsgBox "True"
Else
   MsgBox "False"
End If

nếu trường hợp như trên thì nên thay là:

Mã:
Dim a As Double, b As Double, s As Double
a = 0.11
b = 0.1
s = 0.21

If Val(s) = Val(a + b) Then
   MsgBox "True"
Else
   MsgBox "False"
End If

Nói tóm lại, trong coding nếu có biến Double thì tớ Val() hết. Hầu như ko lỗi bao giờ.
 
Lần chỉnh sửa cuối:
Tôi đã kiểm nghiệm. Các ngôn ngữ lập trình C++, C#, Delphi, VB(A), Fox, Java,...tất cả đều bị lỗi vậy->Đây là lỗi kỹ thuật máy tính (về chíp xử lý khi chuyển đổi số nhị phân).

Tất cả các biến có giá trị lẻ (thập phân) nên khai báo kiểu Currency sẽ đúng cho mọi ngôn ngữ!
Mã:
 Dim a As Currency
 Dim b As Currency
 Dim s As Currency
 a = 0.1
 b = 0.11
 s = 0.21
 If s = (a + b) Then
    MsgBox "Ok"
 End If
 
PhanTuHuong đã viết:
Các bạn thử vào xem và kiểm tra lại xem sao:

Bấm vào

Kết quả như thế nào vậy? -+*/
TẠP CHÍ THẾ GIỚI VI TÍNH đã viết:
Lưu ý: Lỗi trên không thể được lặp lại trong VB cũng như Excel vì trong một số trường hợp Microsoft không hoàn toàn tuân thủ chuẩn IEEE 754. Tuy nhiên, chúng ta có thể thử và thấy Excel đôi khi cũng để lộ những kết quả "kỳ quái". Với VB, chúng ta thấy 0.5-0.4-0.1<>0 nhưng với Excel thì 0.5-0.4-0.1=0 mặc dù 0.5-0.4-0.1)*1<>0 (cụ thể với Excel 2003, chúng tôi có kết quả 2.77556E-17).

Em thử với Excel 2003P2 đâu có như vậy đâu. Em đã lấy tới 45 con số lẻ phía sau rồi mà.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom