2008-12-01 39 views
31

thể trùng lặp:
c# - How do I round a decimal value to 2 decimal places (for output on a page)số Truncate Decimal không tròn Tắt

Tôi muốn cắt ngắn thập phân như dưới đây

tức

  • 2,22939393 -> 2,229
  • 2,22977777 -> 2,229
+0

Câu hỏi liên quan: http://stackoverflow.com/questions/304011/truncate-a-decimal-value-in-c – strager

+1

Tôi tin rằng ass hướng dẫn rõ ràng .trn sẽ làm điều này cho bạn là tốt. –

+4

Câu hỏi trùng lặp không nói gì về làm tròn mà không cắt xén. Trong khi tương tự, các khía cạnh quan trọng của câu hỏi này (không làm tròn) không được trả lời một cách chính xác bởi "trùng lặp". Bỏ phiếu để mở lại. – psubsee2003

Trả lời

14
double d = 2.22977777; 
d = ((double) ((int) (d * 1000.0)))/1000.0 ; 

Tất nhiên, điều này sẽ không hoạt động nếu bạn đang cố gắng cắt ngắn làm tròn lỗi, nhưng nó sẽ làm việc tốt với các giá trị bạn đưa ra trong ví dụ của bạn. Xem hai câu trả lời đầu tiên để this question để biết chi tiết về lý do tại sao đôi khi nó không hoạt động.

+2

wow tất cả những gì chỉ để rút ngắn một số. –

+0

Có vẻ như rất nhiều, nhưng nó làm việc ít hơn rất nhiều so với chuyển đổi thành một chuỗi. :) –

+0

đó là một cách chính xác hơn nữa. –

55

Bạn có thể sử dụng Math.Round:

decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229 

Hoặc bạn có thể sử dụng ToString với N3 numeric format.

string roundedNumber = number.ToString("N3"); 

EDIT: Vì bạn không muốn làm tròn, bạn có thể dễ dàng sử dụng Math.Truncate:

Math.Truncate(2.22977777 * 1000)/1000; //Returns 2.229 
+1

Không hoạt động với ví dụ thứ hai. Tôi chỉ muốn nó cắt ngắn - không được làm tròn. –

+4

+1 cho Math.Truncate – Peter

+1

Chỉ cần nhắc lại: 1 cho Math.Truncate, -1 cho Math.Round, không giải quyết được câu hỏi. –

0

Định dạng nào bạn muốn đầu ra?

Nếu bạn hài lòng với một chuỗi sau đó xem xét mã C# sau:

double num = 3.12345; 
num.ToString("G3"); 

Kết quả sẽ là "3.12".

Liên kết này có thể được sử dụng nếu bạn đang sử dụng .NET. http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Tôi hy vọng điều đó sẽ giúp ích ... nhưng trừ khi bạn xác định ngôn ngữ bạn đang sử dụng và định dạng mà bạn muốn đầu ra khó có thể đề xuất giải pháp thích hợp.

+1

Điều này không giúp OP vì nó làm tròn các chữ số, thay vì cắt ngắn. Ngoài ra, trình định nghĩa chính xác cho định dạng '" G "' là tổng số chữ số, không chỉ là chữ số thập phân (đó là những gì '" F "' hiện) – sinelaw

-2

Hãy thử điều này:

decimal original = GetSomeDecimal(); // 22222.22939393 
int number1 = (int)original; // contains only integer value of origina number 
decimal temporary = original - number1; // contains only decimal value of original number 
int decimalPlaces = GetDecimalPlaces(); // 3 
temporary *= (Math.Pow(10, decimalPlaces)); // moves some decimal places to integer 
temporary = (int)temporary; // removes all decimal places 
temporary /= (Math.Pow(10, decimalPlaces)); // moves integer back to decimal places 
decimal result = original + temporary; // add integer and decimal places together 

Nó có thể được được viết ngắn hơn, nhưng đây là mô tả nhiều hơn.

EDIT: cách viết tắt:

decimal original = GetSomeDecimal(); // 22222.22939393 
int decimalPlaces = GetDecimalPlaces(); // 3 
decimal result = ((int)original) + (((int)(original * Math.Pow(10, decimalPlaces))/(Math.Pow(10, decimalPlaces)); 
+0

Có thể vì nó không biên dịch. Bạn đang phát triển ngôn ngữ nào? Tôi đã thử điều này trong C# ngay bây giờ và tôi nhận được một lỗi để cố gắng nhân một số thập phân của một đôi. –

0

Có lẽ một giải pháp nhanh chóng có thể là:

>>> float("%.1f" % 1.00001) 
1.0 
>>> float("%.3f" % 1.23001) 
1.23 
>>> float("%.5f" % 1.23001) 
1.23001 
-3

Quên Tất cả mọi thứ chỉ cần kiểm tra này

double num = 2.22939393; 
num = Convert.ToDouble(num.ToString("#0.000")); 
+1

Điều này là sai. Bài đăng gốc đang tìm cách cắt ngắn. Điều này sẽ tròn. 2.2296 sẽ dẫn đến 2,23. –

8

Một chức năng để cắt một số thập phân tùy ý:

public decimal Truncate(decimal number, int digits) 
{ 
    decimal stepper = (decimal)(Math.Pow(10.0, (double)digits)); 
    int temp = (int)(stepper * number); 
    return (decimal)temp/stepper; 
} 
+1

Điều này không thành công với số lượng lớn với 'System.OverflowException: Giá trị quá lớn hoặc quá nhỏ đối với Int32' – sinelaw

7

Đây là phương pháp tiện ích không bị tràn số nguyên (như một số câu trả lời ở trên). Nó cũng lưu trữ một số quyền hạn của 10 cho hiệu quả.

static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 }; 
public static double Truncate(this double x, int precision) 
{ 
    if (precision < 0) 
     throw new ArgumentException(); 
    if (precision == 0) 
     return Math.Truncate(x); 
    double m = precision >= pow10.Length ? Math.Pow(10, precision) : pow10[precision]; 
    return Math.Truncate(x * m)/m; 
} 
0

Hãy thử điều này

double d = 2.22912312515; 
int demention = 3; 
double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention))/Math.Pow(10.0, demention); 
2

này tương tự như TcKs gợi ý ở trên, nhưng sử dụng math.truncate chứ không phải là int chuyển đổi

VB: nhưng bạn sẽ nhận được các ý tưởng

Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double 
dim power as decimal = Math.Pow(10, decimalplaces) 
return math.truncate(totruncate * power)/power 
end function 
Các vấn đề liên quan