Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Định dạng Round-trip (R) trong C#

Đị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

FormatMô tảVí dụ (0.91234582637)Round-trip?
RRound-trip0.91234582637✅ Có
G17General 17 digits0.91234582637✅ Có (cho double)
G9General 9 digits0.912345826❌ Mất độ chính xác
F10Fixed 10 decimal0.9123458264❌ Làm tròn

Lưu ý

  • Luôn dùng CultureInfo.InvariantCulture cho round-trip để tránh vấn đề dấu thập phân culture.
  • Cho float (Single), dùng G9 hoặc R.
  • Cho double, dùng G17 hoặc R.
  • decimal không hỗ trợ "R" (dùng "G29").