2016-11-02 17 views
6

Không thể tìm thấy cách đơn giản để chuyển đổi chuỗi kép thành chuỗi. Tôi cần phải chuyển đổi những con số lớn mà không bị biến dạng. Chẳng hạn như:Nhận chuỗi từ giá trị gấp đôi lớn (C#)

double d = 11111111111111111111; 
string s = d.ToString(); 
Console.WriteLine(s); 
//1.11111111111111E+19 

Cách nhận giá trị chuỗi từ giá trị kép giống hệt như người dùng nhập.

11111111111111111111111 => "11111111111111111111111"

1.111111111111111111111 => "1.111111111111111111111"

Bất kỳ ý tưởng làm thế nào nó có thể được thực hiện?

+0

Nếu bạn muốn có một chuỗi, cửa hàng sử dụng đầu vào như chuỗi. – Pikoh

+2

chỉ '.ToString()'? –

+3

Nếu bạn muốn một giá trị [chính xác] (http://stackoverflow.com/q/588004/11683) những gì người dùng đã nhập, 'double' không phải là lựa chọn của bạn. – GSerg

Trả lời

7

double là loại dấu phẩy động. Vì vậy, nó có độ chính xác hạn chế. Trong ví dụ của bạn, bạn có thể làm một cái gì đó như thế này:

double d = 11111111111111111111; 
string s = d.ToString("F0"); 
Console.WriteLine(s); 

Nhưng như bạn sẽ thấy, điều này sẽ ra 11111111111111100000 thay vì 11111111111111111111, vì vậy nó đã mất đi độ chính xác trong quá trình này. Vì vậy, câu trả lời ở đây là sử dụng đúng loại cho công việc. Nếu bạn cần một chuỗi, hãy sử dụng biến chuỗi để lưu trữ giá trị.

Sửa

This was the question tôi đã cố gắng để thấy rằng giải thích vấn đề với điểm toán học nổi, nhờ @GSerg

+0

Tôi có thể sử dụng loại nào? –

+1

Điều đó tùy thuộc vào những gì bạn đang cố gắng đạt được. Bạn đã không nói với chúng tôi bất cứ điều gì về quá trình này. – Pikoh

+0

Cảm ơn câu trả lời của bạn. Bây giờ tôi nhận ra vấn đề là gì. Đôi chỉ có mười lăm chữ số và tất cả phần còn lại của nó là số không hoặc số không hoặc lũy thừa. –

2

Trước hết:. 11111111111111111111111 là lớn cho một giá trị gấp đôi và cũng này giá trị: 1.111111111111111111111 vì chiều dài thập phân tối đa gấp đôi là 17.

Theo mặc định, giá trị kép chứa 15 chữ số thập phân chính xác, mặc dù tối đa 17 chữ số được duy trì trong nội bộ.

Vì lý do này, bạn nên sử dụng BigInteger và sau đó ToString để định dạng đầu ra.
Ngoài ra còn có một thư viện trong thư mục nuget gọi là BigRational, không bao giờ được sử dụng và có vẻ trong giai đoạn Beta nhưng có lẽ sẽ giúp giải quyết vấn đề này.

+0

Còn giá trị gấp đôi thì sao? –

+0

Thật không may là không có tương đương với BigDouble trong C# vì vậy bạn phải tự quản lý phần thập phân. – Tinwor

0

Trong trường hợp chung, bạn không thể làm điều này: người dùng có thể cũng đầu vào, nói 123, trong nhiều một cách:

  • 123
  • 123.00
  • 1.23e2
  • 12.3E1
  • 123.0e+00
  • 1230e-1

v.v.Khi bạn chuyển đổi các đầu vào sử dụng vào double bạn mất định dạng ban đầu:

string userInput = ... 

// double is just 123.0 whatever input has been 
double value = double.Parse(userInput); 

Trong trường hợp bạn muốn thả mũ nếu có thể bạn có thể

double value = 11111111111111111111; 

string result = value.ToString("#######################"); 

Và, xin vui lòng, thông báo, rằng double64 bit để lưu trữ giá trị, đó là lý do tại sao một biến dạng là không thể tránh khỏi đối với số lớn:

// possible double, which will be rounded up 
double big = 123456789123456789123456789.0; 

// 1.2345678912345679E+26 
Console.WriteLine(big.ToString("R")); 
// 123456789123457000000000000 
Console.WriteLine(big.ToString("###########################")); 

Có thể bạn muốn BigInteger thay vì double:

using System.Numerics; 

... 

BigInteger value = BigInteger.Parse("111111111111111111111111111111111"); 

// 111111111111111111111111111111111 
Console.WriteLine(value.ToString()); 
Các vấn đề liên quan