tôi đã được thử nghiệm mã này từ Brainteasers:Không phải là độ chính xác của Double Type là 15 chữ số trong C#?
double d1 = 1.000001;
double d2 = 0.000001;
Console.WriteLine((d1 - d2) == 1.0);
Và kết quả là "False". Khi tôi thay đổi loại dữ liệu:
decimal d1 = 1.000001M;
decimal d2 = 0.000001M;
decimal d3 = d1-d2;
Console.WriteLine(d3 == 1);
Chương trình viết câu trả lời đúng: "True".
Sự cố này chỉ sử dụng 6 chữ số sau dấu phẩy động. Điều gì đã xảy ra với độ chính xác 15 chữ số?
http://msdn.microsoft.com/en-us/library/system.decimal.aspx "Loại thập phân không loại bỏ nhu cầu làm tròn. Thay vào đó, nó giảm thiểu lỗi do làm tròn. Ví dụ: mã tạo ra kết quả là 0,9999999999999999999999999999 thay vì 1 " –
@quant_dev: Đủ công bằng, tôi đã chỉnh sửa câu trả lời của mình để phản ánh điều đó :) –
"System.Decimal sử dụng hệ số chia tỷ lệ để giữ vị trí của chữ số thập phân, cho phép biểu diễn chính xác một số dấu phẩy động" - không đúng; ví dụ, 1/3 sẽ không được biểu diễn chính xác không phải bằng cách tăng gấp đôi (sử dụng cơ sở nhị phân) hay số thập phân (sử dụng số thập phân). Trong thực tế, sự khác biệt duy nhất giữa Double và Decimal là cơ sở, số bit được dành riêng cho số mũ và số mũ, và liệu số mũ có thể thay đổi dấu (có cho Double, no for Decimal) hay không. Ngoài ra, chúng giống nhau. System.Decimal không có độ chính xác tùy ý! –