2012-02-21 36 views
11

Tôi có một giá trị đúp:Tìm số vị trí sau dấu thập phân của một đúp

double a = 4.5565; 

cách dễ nhất để tính toán số chữ số sau dấu thập phân (4 trong trường hợp này) là gì.

Tôi biết rằng tôi có thể chuyển đổi thành chuỗi và thực hiện chia nhỏ và mất thời lượng. Nhưng có cách nào dễ hơn không?

+0

những gì bạn có nghĩa là bằng cách "dễ dàng hơn"? Tôi nghi ngờ có bất cứ điều gì dễ dàng hơn từ viết/đọc quan điểm, nhưng có thể có một số cách dễ dàng hơn về hoạt động của CPU chẳng hạn. – Snowbear

+2

Điều này là không thực sự có thể. http: //en.wikipedia.org/wiki/Double-precision_floating-point_format – SLaks

+2

Giá trị của 'a' có thể sẽ không chính xác là 4.5565. Nếu bạn không hiểu tại sao, tôi khuyên bạn nên đọc điều này: http://csharpindepth.com/Articles/General/FloatingPoint.aspx –

Trả lời

17

Không có cách nào dễ dàng, đặc biệt là vì số chữ số bằng toán học nói có thể nhiều hơn hiển thị. Ví dụ: 4.5565 thực sự được lưu trữ dưới dạng 4.556499999999999772626324556767940521240234375 (nhờ harold để tính toán điều đó). Bạn rất khó tìm ra giải pháp hữu ích cho vấn đề này.

EDIT

Bạn thể đưa ra một số thuật toán mà làm việc như thế này: nếu như bạn tính toán các đại diện thập phân, bạn tìm thấy một số lượng nhất định 9s (hoặc số không) liên tiếp, bạn tròn lên (hoặc xuống) đến vị trí cuối cùng trước khi chuỗi 9s (hoặc số không) bắt đầu. Tôi nghi ngờ rằng bạn sẽ tìm thấy nhiều rắc rối hơn con đường mà bạn mong đợi.

+0

@harold cảm ơn, tôi không có thời gian để làm việc nó ra bản thân mình. – phoog

+0

@phoog Tôi đồng ý với những gì bạn nói chung nhưng bạn nghĩ gì về câu trả lời của tôi? –

+0

@DorCohen Tôi không có thời gian để xem câu trả lời của bạn một cách sâu sắc. Tôi sẽ cố gắng có một cái nhìn vào tối nay hoặc sáng mai. – phoog

3

I Think Chuỗi giải pháp tốt nhất là: ((a-(int)a)+"").length-2

+0

thay vì tách, bạn chỉ không đếm '0.' trong chuỗi. Không khác nhiều so với giải pháp của blitzkriegz –

+0

@ L.B đúng, nhưng trong giải pháp của tôi không cần phân bổ mảng. nó tốt hơn một chút. – james

+4

Thêm "" là một thay thế thực sự khủng khiếp để gọi 'ToString()'. –

7
var precision = 0; 
var x = 1.345678901m; 

while (x*(decimal)Math.Pow(10,precision) != 
     Math.Round(x*(decimal)Math.Pow(10,precision))) 
    precision++; 

precision sẽ bằng với số chữ số có nghĩa của giá trị thập phân (thiết x để 1,23456000 sẽ dẫn đến một độ chính xác 5 mặc dù 8 chữ số là ban đầu được chỉ định bằng chữ). Điều này thực hiện theo thời gian tỉ lệ với số chữ số thập phân. Nó đếm số chữ số thập phân CHỈ; bạn có thể đếm số vị trí bên trái dấu thập phân bằng cách lấy phần nguyên của Math.Log10 (x). Nó hoạt động tốt nhất với số thập phân vì chúng có độ chính xác giá trị tốt hơn do đó có ít lỗi làm tròn.

+0

Giải pháp của bạn rất thanh lịch, cảm ơn bạn –

3

Viết một hàm

int CountDigitsAfterDecimal(double value) 
     { 
      bool start = false; 
      int count = 0; 
      foreach (var s in value.ToString()) 
      { 
       if (s == '.') 
       { 
        start = true; 
       } 
       else if (start) 
       { 
        count++; 
       } 
      } 

      return count; 
     } 
-2

Có một bài viết rất tốt nằm trong diễn đàn STSdb: Number of digits after decimal point. Nó tóm tắt rất nhiều các hiện thực nổi tiếng - ToString(), quyền hạn của 10 phương pháp và cách tiếp cận tiên tiến hơn khác. Các bài kiểm tra so sánh được cung cấp, cho thấy phương pháp nào là nhanh nhất. Các giải pháp được cung cấp làm việc cho các kiểu double và decimal.

+2

Liên kết bị hỏng – berkeleybross

+0

URL hiện tại có vẻ như sau: http://stssoft.com/forum/threads/462-Number-of-digits-after-decimal-point Tuy nhiên, nội dung bị chặn phía sau tường đăng ký để tôi không thể xác minh nội dung. –

+0

@Kris Với liên kết bị hỏng, câu trả lời của bạn không còn hữu ích nữa. Vui lòng sửa hoặc xóa. –

0

Tôi có lẽ sẽ sử dụng đoạn mã này nếu tôi cần,

myDoubleNumber.ToString("R").Split('.')[1].Length 

"R" đây là Round Trip Format Specifier

Chúng ta cần phải kiểm tra các giới hạn chỉ số đầu tiên của khóa học.

0

Tôi nghĩ rằng đây có thể là một giải pháp:

private static int getDecimalCount(double val) 
{ 
    int i=0; 
    while (Math.Round(val, i) != val) 
     i++; 
    return i; 
} 

double val9 = 4.5565d; int count9 = getDecimalCount(val9);//result: 4 

Xin lỗi vì sự trùng lặp ->https://stackoverflow.com/a/35238462/1266873

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