CẬP NHẬT: Câu trả lời là chính xác tại thời điểm viết và độ chính xác dấu phẩy động vẫn không phải là thứ bạn nhận được theo mặc định với to_csv / read_csv (cân bằng hiệu suất chính xác; mặc định ưu tiên hiệu suất).
Ngày nay có những float_format
lập luận có sẵn chopandas.DataFrame.to_csv
và các float_precision
lập luận có sẵn chopandas.from_csv
.
Bản gốc vẫn đáng đọc để nắm rõ hơn vấn đề.
Đó là một lỗi ở gấu trúc, không chỉ trong hàm "to_csv", mà cả trong "read_csv". Nó không phải là một vấn đề chung chung về dấu phẩy động, mặc dù đúng là số học dấu phẩy động là một môn học đòi hỏi sự quan tâm của người lập trình. Bài viết dưới đây làm rõ một chút về chủ đề này:
http://docs.python.org/2/tutorial/floatingpoint.html
Một lớp lót cổ điển cho thấy "vấn đề" là ...
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
... mà không hiển thị 0,3 như người ta mong đợi. Mặt khác, nếu bạn xử lý phép tính bằng số học điểm cố định và chỉ ở bước cuối cùng bạn sử dụng số học dấu phẩy động , nó sẽ hoạt động như bạn mong đợi. Xem cái này:
>>> (1 + 1 + 1) * 1.0 / 10
0.3
Nếu bạn thực sự cần giải quyết vấn đề này, tôi khuyên bạn nên tạo một tệp CSV khác chứa tất cả các số liệu dưới dạng số nguyên, chẳng hạn như nhân với 100, 1000 hoặc hệ số khác, điều này thực sự thuận tiện. Bên trong ứng dụng của bạn, hãy đọc tệp CSV như bình thường và bạn sẽ lấy lại các số nguyên đó. Sau đó chuyển các giá trị đó thành dấu phẩy động, chia cho cùng một hệ số mà bạn đã nhân trước đó.