2012-10-19 29 views

Trả lời

5

Từ các tài liệu cho Double.ToString(IFormatProvider):

dụ này được định dạng với format specifier số chung ("G").

Từ các tài liệu cho General Numeric Format Specifier:

điểm cố định ký hiệu được sử dụng nếu số mũ đó sẽ là kết quả của hiện số trong ký hiệu khoa học lớn hơn -5 và dưới sự xác định chính xác; nếu không, ký hiệu khoa học được sử dụng. Kết quả chứa dấu thập phân nếu được yêu cầu và các số 0 sau dấu thập phân bị bỏ qua. Nếu trình chỉ số chính xác có mặt và số chữ số có nghĩa trong kết quả vượt quá độ chính xác được chỉ định, thì các chữ số cuối vượt quá được xóa bằng cách làm tròn.

Tuy nhiên, nếu số này là số thập phân và bộ định nghĩa độ chính xác bị bỏ qua, ký hiệu điểm cố định luôn được sử dụng và các số 0 sẽ được giữ nguyên.

Từ khoá chính xác mặc định cho Double được ghi chép lại là 15.

Mặc dù trước đó trong bảng, nó diễn đạt hơi khác nhau:

Kết quả: Các nhỏ gọn nhất của một trong hai điểm cố định hoặc ký hiệu khoa học.

tôi đã không làm việc ra cho dù hai luôn tương đương với giá trị giao Double ...

EDIT: Theo nhận xét của Abel:

Ngoài ra, nó không phải là lúc nào cũng là nhất ký hiệu nhỏ gọn. 0,0001 lớn hơn 1E-04, nhưng đầu tiên là đầu ra. Các tài liệu MS không hoàn thành ở đây.

Điều đó phù hợp với mô tả chi tiết hơn, tất nhiên. (Khi số mũ yêu cầu lớn hơn -5 và nhỏ hơn 15.)

+0

Bạn trả lời không bao gồm thông số chính xác, đó là một phần lý do tại sao nó được hiển thị theo cách của nó. Giá trị mặc định là '15'. Ngoài ra, nó không phải lúc nào cũng là ký hiệu nhỏ gọn nhất. '0,0001' lớn hơn' 1E-04', nhưng đầu tiên là đầu ra. Các tài liệu MS không hoàn thành ở đây. – Abel

+0

@Abel: Sẽ bao gồm cả hai bit, cảm ơn. –

+0

Tôi không đồng ý với thuật ngữ "nhỏ gọn nhất" và xem xét tài liệu msdn là gây hiểu nhầm về mặt này. Nếu bạn mất double x = 13950, sau đó định dạng G4 sản xuất "1.395E + 04", mà là dặm từ là "nhỏ gọn nhất". Theo tôi, định dạng "G" hoạt động tốt hơn trong C, Fortran, vv, nơi nó thực sự tạo ra chuỗi "nhỏ gọn nhất". C# buộc tôi phải tìm cách giải quyết ... –

1

Tôi vừa mới thử điều này với một vòng lặp:

double a = 1; 
for (var i = 1; i < 10; i++) 
{ 
    a = a/10; 
    Console.WriteLine(a.ToString(CultureInfo.InvariantCulture)); 
} 

Kết quả là:

0.1 
0.01 
0.001 
0.0001 
1E-05 
1E-06 
1E-07 
1E-08 
1E-09 
+1

Tôi đã thử các thử nghiệm tương tự, nhưng vẫn không có câu trả lời chính xác cho việc chuyển đổi xảy ra khi thực hiện. – geekchic

5

Từ các tài liệu nó sau đó các hình thức nhỏ gọn nhất để đại diện cho số sẽ được chọn.

I.e, khi bạn không chỉ định chuỗi định dạng, default is the "G" format string. Từ số specification of the G format string theo sau:

Kết quả: Nhỏ gọn nhất của điểm cố định hoặc ký hiệu khoa học.

default for the number of digits là 15 với trình chỉ định. Điều đó có nghĩa là một số có thể biểu diễn là chính xác một biểu diễn nhị phân nhất định (như 0,1 trong ví dụ về harriyott) sẽ được hiển thị dưới dạng điểm cố định, trừ khi ký hiệu lũy thừa nhỏ gọn hơn.

Khi có nhiều chữ số hơn, theo mặc định, nó sẽ hiển thị tất cả các chữ số này (tối đa 15) và chọn ký hiệu số mũ một khi ngắn hơn.

Đưa này với nhau:

?(1.0/7.0).ToString() 
"0,142857142857143"  // 15 digits 
?(10000000000.0/7.0).ToString() 
"1428571428,57143"  // 15 significant digits, E-notation not shorter 
?(100000000000000000.0/7.0).ToString() 
"1,42857142857143E+16" // 15 sign. digits, above range for non-E-notation (15) 
?(0.001/7.0).ToString() 
"0,000142857142857143" // non E-notation is shorter 
?(0.0001/7.0).ToString() 
"1,42857142857143E-05" // E-notation shorter 

Và, quan tâm:

?(1.0/2.0).ToString() 
"0,5"     // exact representation 
?(1.0/5.0).ToString() 
"0,2"     // rounded, zeroes removed 
?(1.0/2.0).ToString("G20") 
"0,5"     // exact representation 
?(1.0/5.0).ToString("G20") 
"0,20000000000000001" // unrounded 

này là để hiển thị những gì xảy ra đằng sau những cảnh và lý do tại sao 0.2 được viết như 0.2, không 0,20000000000000001, mà thực sự là Là. Theo mặc định, 15 chữ số có nghĩa được hiển thị. Khi có nhiều chữ số hơn (và luôn có, ngoại trừ một số đặc biệt nhất định), chúng được làm tròn theo cách thông thường. Sau khi làm tròn, các số 0 thừa sẽ bị xóa.

Lưu ý rằng đôi có độ chính xác 15 hoặc 16 chữ số, tùy thuộc vào số. Vì vậy, bằng cách hiển thị 15 chữ số, những gì bạn thấy là một số được làm tròn chính xác và luôn là một biểu diễn hoàn chỉnh và biểu diễn ngắn nhất của đôi.

4

Nó sử dụng định dạng "G" (cho "General"), được xác định để sử dụng "nhỏ gọn nhất của một trong hai điểm cố định hoặc ký hiệu khoa học" http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Vì vậy, kể từ điểm cố định 0.00001 là hơn ký tự hơn 1E-05 nó sẽ ưu tiên ký hiệu khoa học. Tôi cho rằng nếu chúng có chiều dài bằng nhau, nó ủng hộ điểm cố định.

+0

'0,0001' có nhiều ký tự hơn là '1E-04', nhưng được ưa thích ...;) – Abel

Các vấn đề liên quan