2012-11-23 141 views
17

Làm cách nào để nhân hai số thập phân và làm tròn kết quả xuống 2 chữ số thập phân?Làm tròn xuống 2 chữ số thập phân trong C#

Ví dụ nếu phương trình là 41,75 x 0,1 kết quả sẽ là 4,7575. Nếu tôi làm điều này trong C# với số thập phân, nó sẽ tự động làm tròn lên đến 4,18. Tôi muốn làm tròn xuống 4.17.

Tôi đã thử sử dụng Math.Floor nhưng nó chỉ giảm xuống 4.00. Dưới đây là ví dụ:

Math.Floor (41.75 * 0.1); 
+0

bạn đã thử 'Math.Round'? – nhahtdh

+2

Nếu bạn muốn làm tròn, bạn có thể sử dụng quá tải Math.Round điều khiển cách xử lý điểm giữa. Nếu bạn muốn sàn tất cả các thời gian, xem xét nhân với 100, sàn, sau đó chia cho 100. – John

+0

Bạn có muốn làm tròn tiêu chuẩn cho 4.176 trở lên? –

Trả lời

28

Chức năng Math.Round(...) có Enum để cho biết chiến lược làm tròn để sử dụng. Thật không may hai định nghĩa sẽ không chính xác phù hợp với tình hình của bạn.

Hai chế độ Midpoint làm tròn là:

  1. AwayFromZero - Khi một số nằm giữa hai người khác, nó được làm tròn về phía số khu vực gần đó là đi từ con số không. (Aka, tròn lên)
  2. ToEven - Khi một số nằm giữa hai số khác, số này được làm tròn về số chẵn gần nhất. (Sẽ ủng hộ .16 trên .17 và .18 trên .17)

Điều bạn muốn sử dụng là Floor với một số phép nhân.

var output = Math.Floor((41.75 * 0.1) * 100)/100; 

Biến số output phải có 4,17 trong đó ngay bây giờ.

Trong thực tế, bạn cũng có thể viết một hàm để có một chiều dài thay đổi cũng như:

public decimal RoundDown(decimal i, double decimalPlaces) 
{ 
    var power = Convert.ToDecimal(Math.Pow(10, decimalPlaces)); 
    return Math.Floor(i * power)/power; 
} 
+1

Thực tế, nó sẽ hoạt động bằng cách sử dụng quá tải 'Math.Round Method (Decimal, Int32, MidpointRounding)' (kiểm tra http://stackoverflow.com/questions/13522095/rounding-down- to-2-decimal-places-in-c-sharp) –

+0

i * nguồn điện là lỗi. Bạn có nghĩa là gấp đôi có thể có. –

+0

Bạn không thể nhân đôi với số thập phân – Ruan

5

Không có hỗ trợ cho chính xác sàn/ceillin trong C#.

Tuy nhiên, bạn có thể bắt chước chức năng bằng cách nhân số, tầng và sau đó chia cho cùng một hệ số.

ví dụ:

decimal y = 4.314M; 
decimal x = Math.Floor(y * 100)/100; // To two decimal places (use 1000 for 3 etc) 
Console.WriteLine(x); // 4.31 

Không phải là giải pháp lý tưởng, nhưng nên làm việc nếu số là nhỏ.

1

Một giải pháp nữa là làm tròn số 0 về không làm tròn từ số không. Nó phải là một cái gì đó như thế này:

static decimal DecimalTowardZero(decimal value, int decimals) 
    { 
     // rounding away from zero 
     var rounded = decimal.Round(value, decimals, MidpointRounding.AwayFromZero); 

     // if the absolute rounded result is greater 
     // than the absolute source number we need to correct result 
     if (Math.Abs(rounded) > Math.Abs(value)) 
     { 
      return rounded - new decimal(1, 0, 0, value < 0, (byte)decimals); 
     } 
     else 
     { 
      return rounded; 
     } 
    } 
9
public double RoundDown(double number, int decimalPlaces) 
{ 
    return Math.Floor(number * Math.Pow(10, decimalPlaces))/Math.Pow(10, decimalPlaces); 
} 
Các vấn đề liên quan