2012-03-29 36 views
7

Trong C#, tôi đang cố gắng lấy hai chữ số thập phân cuối của số double với số làm tròn KHÔNG. Tôi đã thử mọi thứ từ Math.Floor đến Math.Truncate và không có gì đang hoạt động.Nhận 2 vị trí thập phân cuối cùng mà không làm tròn số

Mẫu kết quả tôi muốn:

1,424.2488298 -> 1,424.24 
53.5821 -> 53.58 
10,209.2991 -> 10,209.29 

Bất kỳ ý tưởng?

+1

Nếu bạn làm việc trong * decimal * sau đó tại sao bạn lại sử dụng * double * khi bạn có thể sử dụng * decimal *? –

+0

Bạn có thể truy cập bài đăng này và tìm nội dung phù hợp cho mình http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

Trả lời

22

Vâng, về mặt toán học nó đơn giản:

var f = 1.1234; 
f = Math.Truncate(f * 100)/100; // f == 1.12 

Move thập phân hai nơi bên phải, đúc đến một int để cắt xén, thay đổi nó trở lại sang trái hai nơi. Cũng có thể có nhiều cách để làm điều đó, nhưng tôi không thể nhìn ngay bây giờ. Bạn có thể khái quát nó:

double Truncate(double value, int places) 
{ 
    // not sure if you care to handle negative numbers...  
    var f = Math.Pow(10, places); 
    return Math.Truncate(value * f)/f; 
} 
+0

Không đơn giản lắm. Tăng gấp đôi giữ một phạm vi lớn hơn ints. – Joe

+0

@joe: Ahh điểm tốt, sử dụng Math.Truncate thay vào đó, không có yêu cầu cast –

+0

@EdS. Tôi đã thử điều này trên giá trị 136.2025 bằng cách sử dụng phương pháp đầu tiên của bạn và nó cắt nó để 136.2 và giảm 0. Có cách nào để giữ 0 trong nó? – mint

5
double d = Math.Truncate(d * 100)/100; 
2

Một giải pháp chung:

public static double SignificantTruncate(double num, int significantDigits) 
    { 
     double y = Math.Pow(10, significantDigits); 
     return Math.Truncate(num * y)/y; 
    } 

Sau đó

double x = 5.3456; 
    x = SignificantTruncate(x,2); 

Sẽ tạo ra kết quả mong muốn x=5.34.

14

Lời khuyên của tôi: ngừng sử dụng double ở địa điểm đầu tiên. Nếu bạn cần làm tròn số thập phân thì tỷ lệ cược là tốt, bạn nên sử dụng decimal. Ứng dụng của bạn là gì?

Nếu bạn có một đôi, bạn có thể làm điều đó như thế này:

double r = whatever; 
decimal d = (decimal)r; 
decimal truncated = decimal.Truncate(d * 100m)/100m; 

Lưu ý rằng kỹ thuật này sẽ thất bại nếu giá trị tuyệt đối của đôi lớn hơn 792281625142643375935439504, bởi vì nhân bởi 100 sẽ thất bại . Nếu bạn cần xử lý các giá trị lớn thì bạn sẽ cần phải sử dụng các kỹ thuật đặc biệt. (Tất nhiên, do thời gian một đôi được rằng lớn, bạn cũng vượt quá khả năng của mình để đại diện cho các giá trị với hai chữ số sau chữ số thập phân nơi anyway.)

2
Math.Round(NumberToRound - (double)0.005,2) 

tức

Math.Round(53.5821 - (double)0.005,2) // 53.58 
Math.Round(53.5899 - (double)0.005,2) // 53.58 
Math.Round(53.5800 - (double)0.005,2) // 53.58 
Các vấn đề liên quan