Khi chuyển đổi độ chính xác "cao" thành nhị phân, tôi mất độ chính xác với Convert.ToDecimal hoặc truyền sang (Thập phân) do Làm tròn.Double to Decimal mà không làm tròn sau 15 chữ số
Ví dụ:
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1
Giá trị thập phân được trả về bởi Convert.ToDecimal (double) chứa tối đa là 15 chữ số có nghĩa. Nếu tham số giá trị chứa hơn 15 chữ số có nghĩa, nó được làm tròn bằng cách làm tròn đến gần nhất.
Vì vậy, tôi để giữ cho độ chính xác của tôi, tôi phải chuyển đổi gấp đôi của tôi vào một String và sau đó gọi Convert.ToDecimal (String):
decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d
Phương pháp này đang làm việc nhưng tôi muốn tránh sử dụng một biến String để chuyển đổi một đôi để thập phân mà không làm tròn sau 15 chữ số?
Bạn có biết trước phạm vi cho 'd' không? Tôi có thể cung cấp một số giải pháp nhẹ trong mã giả (tôi không đủ quen thuộc với C# để viết chúng trong C#) nếu bạn biết rằng 'd' nằm trong phạm vi như [-2..2] –
d sẽ luôn ở giữa [- 1,1] –
Tôi giả định đây là một 'double' đến từ một nơi khác mà bạn không thể thay đổi? Nếu nó được khai báo như một số thập phân từ get-go ('decimal d = -0.99999999999999956m;') thì nó vẫn duy trì độ chính xác đó. –