2012-11-23 24 views
17

Jak mogę pomnożyć dwa miejsca po przecinku i zaokrąglić wynik do 2 miejsc po przecinku?Zaokrąglanie w dół do 2 miejsc po przecinku w C#

Na przykład, jeśli równanie wynosi 41,75 x 0,1, wynik będzie wynosił 4,175. Jeśli zrobię to w języku C# z miejscami dziesiętnymi, automatycznie zaokrągli się do 4,18. Chciałbym zaokrąglić do 4,17.

Próbowałem używać Math.Floor, ale zaokrąglono do 4.00. Oto przykład:

Math.Floor (41.75 * 0.1); 
+0

Czy próbowałeś 'Math.Round'? – nhahtdh

+2

Jeśli chcesz zaokrąglić, możesz użyć przeciążenia Math.Round, które steruje sposobem obsługi punktu środkowego. Jeśli chcesz cały czas mieć podłogę, rozważ pomnożenie przez 100, piętro, a potem podziel przez 100. – John

+0

Czy chcesz standardowego zaokrąglenia dla 4.176 i więcej? –

Odpowiedz

28

Funkcja Math.Round(...) ma Enum powiedzieć to, co strategia zaokrąglenie w użyciu. Niestety dwa zdefiniowane nie będą dokładnie pasowały do ​​twojej sytuacji.

Oba tryby są Zaokrąglanie Symetria:

  1. AwayFromZero - Kiedy numer jest w połowie drogi między dwoma innymi, jest ona zaokrąglana w kierunku najbliższego numeru, który jest oddalony od zera. (Aka, zaokrąglanie w górę)
  2. ToEven - Kiedy liczba jest w połowie drogi między dwoma innymi, jest ona zaokrąglana w kierunku najbliższej liczby parzystej. (Czy przysługa .16 powyżej 17, i .18 powyżej 17)

Co chcesz użyć to Floor z pewnym mnożeniem.

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

Zmienna output powinna mieć teraz wartość 4,17.

W rzeczywistości można również napisać funkcję do podjęcia zmienną długość, a także:

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

Rzeczywiście, powinien działać przy użyciu przeciążenia 'Math.Round Method (Decimal, Int32, MidpointRounding)' (sprawdź http://stackoverflow.com/questions/13522095/rounding-down- to-2-decimal-places-in-c-sharp) –

+0

Moc i * jest błędem. Miałeś na myśli podwójne. –

+0

Nie możesz pomnożyć podwójnej liczby dziesiętnej – Ruan

5

Nie ma natywne wsparcie dla precyzyjnego podłogi/ceillin języku C#.

Można jednak naśladować funkcjonalność, mnożąc liczbę, podłogę, a następnie dzieląc przez ten sam mnożnik.

np

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 

nie idealne rozwiązanie, ale powinno działać, jeśli liczba jest niewielka.

1

Jeszcze jedno rozwiązanie polega na wykonaniu zaokrągleń w kierunku zera od zaokrągleń od zera. To powinno być coś takiego:

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); 
} 
Powiązane problemy