Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1550 | Anzahl registrierter User: 1841 | Besucher online: 9
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Kaufmännisches Runden in Decimal


Autor: Yellow
Sprache: C#
Bewertung:
5.94 (4 votes)
Anzahl der Aufrufe: 22594
  
Kick it on dotnet-kicks.de  

Beschreibung:

In .NET 1.1 ist, wie in einigen anderen Sprachen auch, das Runden mit Math.Round auf Grund von möglichen Verzerrungen bei Statistiken (siehe Wikipedia, siehe IEEE 754), nicht für ein kaufmännisches Runden geeignet. Aus 3,65 wird (bei Runden auf eine Ziffer) 3,6 da zur nächsten geraden Stelle gerundet wird. Diese statische Methode umgeht diese Besonderheit und ermöglicht ein kaufmännisches Runden.

Abgelegt unter: Round, kaufmännisch, Runden, Decimal, C#, Snippet.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Rundet kaufmännisch auf die Anzahl der übergebenen Nachkommastellen
///
/// Achtung: Seit .NET 2.0 gibt es folgende Überladung die dieses Snippet hinfällig machen: Math.Round(3.65m,1,MidpointRounding.AwayFromZero)
/// </summary>
/// <param name="value">Zu rundender Wert</param>
/// <param name="dec">Anzahl der Nachkommastellen</param>
/// <returns>Gerundeter Wert</returns>
public static decimal CommercialRound(decimal value, int dec)
{
	// um die Anzahl der Dezimalstellen nach links verschieben
	decimal x = value * Convert.ToDecimal(Math.Pow(10, dec));

	// Dezimalstellen abtrennen
	decimal y = Math.Floor(x);

	// ist die Differenz größer oder gleich 0.5 soll aufgerundet werden
	if ((x-y) >= 0.5m) y++;

	// um die Anzahl der Dezimalstellen nach rechts verschieben 
	return y / Convert.ToDecimal(Math.Pow(10, dec));
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

BlackDragon schrieb am:  07.11.2006 00:08:52

komisch bei mir macht er das richtig
3,6 = Math.Round(Convert.ToDecimal("3,64"),1,MidpointRounding.AwayFromZero));
3,7 = Math.Round(Convert.ToDecimal("3,65"),1,MidpointRounding.AwayFromZero));
Yellow schrieb am:  07.11.2006 00:45:52

Ja, BlackDragon... da hast du in der Tat recht. Diese Überladung ist seit dem Framework 2.0 neu hinzugekommen. Insofern ist mein Snippet nur für .NET 1.1 zu empfehlen. Wieder etwas gelernt, danke für den Hinweis ;o).
Marvin schrieb am:  10.02.2007 22:58:30

Der Code funktioniert für negative Zahlen nicht zuverlässig.
So liefert bspw. CommercialRound(-1.55m, 1) als Ergebnis -1.5 und nicht -1.6!
Oder ist das Absicht?

Hier meine Implementierung:


public static decimal RoundNumber( decimal number, int decimals )
{
if ( decimals < 0 || decimals > 8 )
throw new ArgumentOutOfRangeException( "decimals must be between 0 and 8", "decimals" );

//Komma verschieben
int shiftFactor = (int)Math.Pow( 10, decimals );
decimal tmp = number * shiftFactor;

//Runden: 0.5 addieren/subtrahieren und dann Nachkommastellen abschneiden
decimal diff = ( tmp >= 0 ? 0.5m : -0.5m );
tmp = (long)( tmp + diff );

//Komma wieder verschieben
return ( tmp / shiftFactor );
}
Yellow schrieb am:  14.02.2007 10:11:33

Hallo Marvin,

danke für den Hinweis. Du hast natürlich recht. Die kaufmännische Rundung muss bei negativen Zahlen abrundnen...


Diese Snippets könnten für Sie interessant sein:
[C#] Kaufmännisches Runden
[VB.NET] Nachkommastellen Wert erfahren
[C#] Runden auf vorgegebene Nachkomma-Werte
[C#] DateTime Runden
[C#] NumLock abfragen
[C#] Nummernformate beim Parsen fix festlegen
[C#] Umwandlung von Hexadezimal <> Dezimal
[C#] Dezimal in Binär umwandeln
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[C#] Ein kleiner Konsolen Taschenrechner
[C#] Prüft Zeitformat auf 24 Stunden
[C#] Datei/Ordner durch Erweiterungsmethoden abfragen
[C#] GetCharts
[C#] XML in DataTable laden
[C#] Generische Between Methode
[ASP.net] Formularelement fokusieren auf Ajax Seiten
[C#] Quadratwurzel ziehen
[C#] Cast to Enum
[C#] ASP.NET: Metatags und Titel zur Laufzeit setzen
[C#] Aufrufenden Typ identifizieren
[C#] WMI Getter
[C#] Sql Server Instanzen finden
[C#] WPF: Image aus dem Web in Image-Element anzeigen
[C#] Quoted Printable Encoder
[C#] URL auslesen
[C#] User-Verwaltung in eine ASP.NET Website einbauen
[C#] GUID des aktuellen Assembly ermitteln
[C#] Windows Forms Anwendungs-Sessions verwalten
[C#] User-Management für WPF Smart Client Anwendung
[C#] Silverlight Anwendung erstellen
[C#] User-Verwaltung in eine WinForm einbauen
[C#] Java WebService aus einem WinForms-Client aufrufen
[C#] C# Ist ein POINT zwischen ... und ...
[C#] NumTextBox (Kurzversion)
[C#] Another Bin-Watch (Console)
[C#] SystemIconsImageListWrapper
[C#] WatchedList
[C#] Datenbankverbindung herstellen
[C#] Einfache Ini Klasse
[C#] Youtube Download Klasse für C#
[C#] InputBox WPF C#
[C#] C# Ordner auslesen und in Liste speichern "rekursiv"
[C#] C# XOR Crypt

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.