2010-09-26 9 views
9

Điều này phải dễ dàng, nhưng tôi không thể tìm thấy một phương pháp được xây dựng trong được xây dựng trong cho nó, khung .net phải có phương pháp để thực hiện việc này!Làm cách nào để làm tròn số thập phân xuống 2 chữ số thập phân trong .Net?

private decimal RoundDownTo2DecimalPlaces(decimal input) 
{ 
    if (input < 0) 
    { 
     throw new Exception("not tested with negitive numbers"); 
    } 

    // There must be a better way! 
    return Math.Truncate(input * 100)/100; 
} 
+0

Bạn có muốn làm tròn số thập phân hoặc biểu diễn văn bản không? –

+0

@Henk, tôi cần xuất giá trị dưới dạng văn bản, nhưng thay vì làm tròn trước khi xuất. Nó giống như giá trị sẽ phải nạp vào các calcs khác sau đó. –

+0

có thể trùng lặp của [Làm tròn đôi thành 2 số có nghĩa sau dấu thập phân] (http: // stackoverflow.com/questions/2808535/round-a-double-to-2-number-figure-after-decimal-point) – ecatmur

Trả lời

0

Không có phương pháp xây dựng trong khuôn khổ .net để thực hiện việc này, các câu trả lời khác nói cách viết mã của riêng bạn.

2
Math.Floor(number * 100)/100; 
+0

bơ sau đó giải pháp của tôi, như Math.Floor cho kết quả chính xác với số âm. xem http://stackoverflow.com/questions/14/whats-the-difference-between-math-floor-and-math-truncate-in-net –

3

Sử dụng .Truncate() để có được số tiền chính xác, hoặc .Round() để làm tròn.

decimal dNum = (decimal)165.6598F; 
decimal dTruncated = (decimal)(Math.Truncate((double)dNum*100.0)/100.0); //Will give 165.65 
decimal dRounded = (decimal)(Math.Round((double)dNum, 2)); //Will give 165.66 

Hoặc bạn có thể thực hiện một phương pháp khuyến nông để chạy nó như dNum.ToTwoDecimalPlaces();

public static class Extensions 
{ 
    public static decimal ToTwoDecimalPlaces(this decimal dNum) 
    { 
     return ((decimal)(Math.Truncate((double)dNum*100.0)/100.0)); 
    } 
} 
15

Nếu bạn đang làm tròn xuống sau đó bạn cần:

Math.Floor(number * 100)/100; 

nếu bạn đang tìm kiếm một cái gì đó được gọi là 'ngân hàng làm tròn' (có thể không phải nếu nó cho đầu ra và không cho số liệu thống kê/tổng hợp) sau đó:

Math.Round(number, 2); 

Cuối cùng nếu bạn muốn, không chắc chắn những gì thuật ngữ chính xác là, 'làm tròn bình thường':

Math.Round(number, 2, MidpointRounding.AwayFromZero); 
+0

Nhìn vào phản hồi của tôi bên dưới: MidpointRounding.AwayFromZero hoặc MidpointRounding.ToEven chỉ định cách để xử lý các con số kết thúc bằng '5': MidpointRounding.ToEven chỉ định rằng 1.135 phải tròn thành 1.13 và 1.145 đến 1.15 MidpointRounding.AwayFromZero xác định rằng 1.135 phải tròn thành 1.14 và 1.145 đến 1.15 –

5

Sử dụng Math.Floor nếu bạn muốn làm tròn xuống tha giá trị, hoặc Math.Round nếu bạn muốn để có được một chính xác vòng. Math.Truncate chỉ cần loại bỏ phần thập phân của số, vì vậy bạn sẽ có được kết quả xấu đối với số âm:

var result= Math.Floor(number * 100)/100; 

Math.floor luôn trả về giá trị nhỏ nhất không thể thiếu đó là ít (Tầng) hoặc cao hơn (trần) so với giá trị được chỉ định. Vì vậy, bạn không nhận được một làm tròn chính xác. Ví dụ:

Math.Floor(1.127 * 100)/100 == 1.12 //should be 1.13 for an exact round 
Math.Ceiling(1.121 * 100)/100 == 1.13 //should be 1.12 for an exact round 

Luôn thích phiên bản Math.Round chứa thông số làm tròn giữa điểm. Tham số này chỉ định cách xử lý các giá trị điểm giữa (5) làm chữ số cuối cùng.

Nếu bạn không chỉ định AwayFromZero làm giá trị cho thông số, bạn sẽ nhận được hành vi mặc định, đó là ToEven. Ví dụ, sử dụng ToEven như làm tròn phương pháp, bạn nhận được:

Math.Round(2.025,2)==2.02 
Math.Round(2.035,2)==2.04 

thay vào đó, sử dụng MidPoint.AwayFromZero param:

Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03 
Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04 

Vì vậy, đối với một tròn bình thường, nó là tốt nhất để sử dụng mã này:

var value=2.346; 
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero); 
+0

bạn đã đọc quesion chưa Tôi nói "vòng xuống" –

+0

Xin lỗi, lời xin lỗi của tôi ... –