Thứ nhất, nó quan trọng cần ghi nhớ rằng 0.6
không thể được đại diện một cách chính xác như một float
tuy nhiên nó thể được đại diện một cách chính xác như một double
(không chính xác của dấu chấm động số học cũng là tài liệu, nếu nó không rõ ràng lý do tại sao 0.6
không thể được biểu diễn chính xác dưới dạng phao, hãy thử this link)
Lý do tại sao bạn nhìn thấy hành vi trên xuống trình biên dịch - nếu bạn nhìn vào bộ biên dịch trong bộ phản xạ thì những gì đang diễn ra ở đây hơi rõ ràng hơn:
(CẬP NHẬT Tôi đã thay đổi mã để nó không sử dụng Console.WriteLine
, như tôi nhận ra rằng trình biên dịch được lựa chọn một tình trạng quá tải cho bạn, mà lẫn lộn tình hình)
// As written in source
var j = (double)(float)0.6;
var k = (double)0.6f;
var l = (double)(6/10f);
var m = (double)(float)(6/10f);
// Code as seen by Reflector
double j = 0.60000002384185791;
double k = 0.60000002384185791;
double l = 0.6;
double m = 0.6;
Tại sao trình biên dịch chọn biên dịch theo cách đặc biệt này là ngoài tôi (FYI, đây là tất cả với optimisations tắt)
Một số trường hợp khác thú vị:
// Code
var a = 0.6;
var b = (double)0.6;
var c = 0.6f;
var d = (float)0.6;
var e = 6/10;
var f = 6/(10f);
var g = (float)(6/10);
var h = 6/10f;
var i = (double)6/10;
// Prints out 0.60000002384185791
double n = (float)0.6;
double o = f;
// As seen by Reflector
double a = 0.6;
double b = 0.6;
float c = 0.6f;
float d = 0.6f;
int e = 0;
float f = 0.6f;
float g = 0f;
float h = 0.6f;
double i = 0.6;
double n = 0.60000002384185791;
double o = f;
Trình biên dịch chỉ dường như để làm ab ove lừa trong một vài trường hợp đặc biệt, tại sao nó chỉ này khi đúc đến một đôi là hoàn toàn vượt ra ngoài tôi!
Phần còn lại của thời gian dường như làm một số thủ thuật để làm cho số học dấu phẩy động dường như để hoạt động ở nơi thực tế bình thường thì không.
Bằng cách này trong Java, kết quả là 0,6000000238418579 cho tất cả những điều trên. –
Tôi đang sử dụng cửa sổ ngay lập tức. Tôi đã thử nghiệm trong chương trình, họ không bằng nhau.Vì vậy, nó không phải là một vấn đề của foramtting. – zhy2002
http://stackoverflow.com/questions/1778368/python-float-str-float-weirdness – Sharun