2010-01-20 4 views
16

Làm cách nào để tránh làm tròn giá trị kép khi chuyển đổi thành chuỗi? Tôi đã thử cả hai Convert.ToStringToString() với cùng một kết quả.Tại sao ToString() Làm tròn giá trị gấp đôi của tôi?

Ví dụ: đôi của tôi có thể trông giống như 77.987654321 và hai chuyển đổi chuỗi chuyển đổi thành 77.98765. Tôi cần phải giữ độ chính xác của giá trị như hiện tại.

+1

Đối với tôi ToString() giữ độ chính xác. Một số mã sẽ được tốt đẹp. –

+0

Xem thêm http://stackoverflow.com/questions/1421520/formatting-doubles-for-output-in-c –

Trả lời

23

Theo mặc định, phương pháp .ToString() của Double trả về 15 chữ số chính xác. Nếu bạn muốn 17 chữ số đầy đủ mà giá trị kép giữ trong nội bộ, bạn cần phải chuyển thông số định dạng "G17" cho phương thức.

String s = value.ToString("G17"); 

Có nguồn gốc từ MSDN docs:

Theo mặc định, giá trị trả về chỉ chứa 15 chữ số chính xác mặc dù tối đa là 17 chữ số được duy trì trong nội bộ. Nếu giá trị của trường hợp này có lớn hơn 15 chữ số, ToString trả về PositiveInfinitySymbol hoặc NegativeInfinitySymbol thay vì số dự kiến. Nếu bạn yêu cầu thêm độ chính xác , hãy chỉ định định dạng với thông số định dạng "G17", luôn trả về 17 chữ số chính xác, hoặc "R", trả về 15 chữ số nếu số có thể được biểu diễn với độ chính xác hoặc 17 chữ số nếu số chỉ có thể được thể hiện với độ chính xác tối đa .

+0

Nó làm cho một trong những thắc mắc tại sao họ không chỉ trả lại tất cả 17 chữ số tự động, và cho phép người dùng làm tròn nó nếu họ muốn. –

+0

@ Robert: Tôi biết ý của bạn là gì. Thật kỳ lạ khi họ bỏ lỡ chúng. Nếu nó là hàng trăm tôi hiểu, nhưng vì lợi ích của 2 chữ số nó có vẻ kỳ quặc. –

+0

Lưu ý rằng nó nói "a * tối đa * 17 chữ số". Hai cái cuối cùng có lẽ không chính xác, có vẻ như một lý do hợp lệ để loại bỏ chúng theo mặc định. – Thomas

5

Lớp học Jon Skeet DoubleConverter có phương thức ToExactString() sẽ trả lại giá trị chính xác của chuỗi kép làm chuỗi.

http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

+0

bất kỳ thông tin nào về giấy phép cho mã này? –

+0

Có lẽ bạn nên hỏi Jon, nhưng rất có thể là "sử dụng nó theo cách bạn muốn". Hầu hết các dự án GitHub của Jon đều là Apache hoặc BSD. –

13

Hãy thử một cái gì đó giống như

myDouble.ToString("R") 

Xem thêm The Round-trip ("R") Format Specifier:

Các khứ hồi ("R") đảm bảo format specifier rằng một giá trị số đó được chuyển đổi sang một chuỗi sẽ được phân tích cú pháp trở lại thành cùng một giá trị số.

0

Không đảm bảo, nhưng hãy thử ToString ("R").

2

Tôi giả định rằng câu trả lời chính cho làm tròn đi hai chữ số cuối, là ẩn tính không ổn định/làm tròn số do độ chính xác hữu hạn float/double.

Ví dụ với không làm tròn:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907" 

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898" 

Trông một chút lạ trong 3 chữ số cuối cùng, phải không?

Ví dụ với làm tròn:

(Math.Sqrt(7)).ToString() = "2.64575131106459" 

(Math.Sqrt(7)+6).ToString() = "8.64575131106459" 

Look "hoàn hảo", phải không?

:-)