Định dạng "R" (Round-trip) đảm bảo một giá trị số được chuyển sang chuỗi và parse ngược lại ra chính xác giá trị gốc (không mất độ chính xác). Hỗ trợ cho Single (float), Double, BigInteger.
Ví dụ với Double
double doubleVal = 0.91234582637;
string str = doubleVal.ToString("R", CultureInfo.InvariantCulture);
double roundTrip = double.Parse(str, CultureInfo.InvariantCulture);
bool isEqual = doubleVal.Equals(roundTrip); // true
Mã nguồn hoàn chỉnh
using System;
using System.Numerics;
using System.Globalization;
class Demo
{
static void Main()
{
double doubleVal = 0.91234582637;
string str = doubleVal.ToString("R", CultureInfo.InvariantCulture);
double resRound = double.Parse(str, CultureInfo.InvariantCulture);
Console.WriteLine(doubleVal.Equals(resRound)); // True
}
}
Kết quả
True
Tại sao cần Round-trip?
Số thực dấu chấm động (float/double) lưu trữ ở dạng nhị phân. Khi chuyển sang chuỗi thập phân, có thể mất độ chính xác. Format "R" dùng đủ chữ số để đảm bảo parse ngược lại ra đúng bit pattern gốc.
So sánh các format cho Double
| Format | Mô tả | Ví dụ (0.91234582637) | Round-trip? |
|---|---|---|---|
| R | Round-trip | 0.91234582637 | ✅ Có |
| G17 | General 17 digits | 0.91234582637 | ✅ Có (cho double) |
| G9 | General 9 digits | 0.912345826 | ❌ Mất độ chính xác |
| F10 | Fixed 10 decimal | 0.9123458264 | ❌ Làm tròn |
Lưu ý
- Luôn dùng
CultureInfo.InvariantCulturecho round-trip để tránh vấn đề dấu thập phân culture. - Cho
float(Single), dùngG9hoặcR. - Cho
double, dùngG17hoặcR. decimalkhông hỗ trợ "R" (dùng "G29").