Lựa chọn tốt nhất: Sử dụng định dạng C99 thập lục phân dấu chấm động:
printf("%a", someDouble);
Strings sản xuất theo cách này có thể được chuyển đổi trở lại thành double
với C99 strtod()
chức năng, và cũng với scanf()
chức năng. Một số ngôn ngữ khác cũng hỗ trợ định dạng này. Một số ví dụ:
decimal number %a format meaning
--------------------------------------------
2.0 0x1.0p1 1.0 * 2^1
0.75 0x1.8p-1 1.5 * 2^-1
Định dạng thập lục phân có ưu điểm là tất cả các cơ quan đại diện là chính xác. Do đó, việc chuyển đổi chuỗi trở lại thành dấu phẩy động sẽ luôn cung cấp số nguyên gốc, ngay cả khi ai đó thay đổi chế độ làm tròn mà trong đó chuyển đổi được thực hiện. Điều này không đúng đối với các định dạng không chính xác.
Nếu bạn không muốn sử dụng định dạng thập lục phân vì bất kỳ lý do gì và sẵn sàng giả định rằng chế độ làm tròn sẽ luôn tròn thành gần nhất (mặc định), thì bạn có thể lấy đi định dạng dữ liệu của mình dưới dạng số thập phân với ít nhất 17 chữ số có nghĩa. Nếu bạn có một thói quen chuyển đổi được làm tròn chính xác (hầu hết - không phải tất cả - nền tảng nào), điều này sẽ đảm bảo rằng bạn có thể thực hiện một chuyến đi khứ hồi từ chuỗi kép và ngược lại mà không mất đi độ chính xác nào.
Nguồn
2010-03-19 21:57:29
Vấn đề ngôn ngữ. Bạn đang làm việc ở ngôn ngữ nào Không thể cung cấp mã không có ngôn ngữ cụ thể được đề cập trong vấn đề. –
Tôi đã không đề cập đến ngôn ngữ (D) vì nó tương đối hiếm, vì vậy tôi đã lên kế hoạch viết lại một thuật toán được viết bằng bất kỳ ngôn ngữ nào để D. –
Làm thế nào về NaN, -0.0, inf, -inf? Câu trả lời hiện tại dường như không tính đến điều này. –