Ich habe ein kleines Stück Software in C# erstellt, die Überstunden im Dezimalformat berechnet. Ich habe es so entworfen, dass es immer auf die nächste Zehntel Stunde abgerundet wird. Das Problem, das ich habe, ist, dass, wenn ich versuche, eine Zeit zu berechnen, die genau 2 Stunden 12 Minuten oder 3 Stunden 12 Minuten ist, bekomme ich ein falsches Ergebnis. Der entsprechende Code folgt:TimeSpan Berechnung Fehler
DateTime start = new DateTime(
dtpDateStart.Value.Year,
dtpDateStart.Value.Month,
dtpDateStart.Value.Day,
dtpTimeStart.Value.Hour,
dtpTimeStart.Value.Minute,
0);
DateTime end = new DateTime(
dtpDateEnd.Value.Year,
dtpDateEnd.Value.Month,
dtpDateEnd.Value.Day,
dtpTimeEnd.Value.Hour,
dtpTimeEnd.Value.Minute,
0);
TimeSpan subtotal = end - start;
double subtotalRounded = subtotal.TotalHours;
subtotalRounded = (Math.Floor(subtotalRounded * 10)/10);
dtpDateStart
, dtpTimeStart
, dtpDateEnd
und dtpTimeEnd
sind alle Picker Kontrollen Datum Zeit in einem Projekt Win Forms.
Wenn ich diesen Code debuggen finde ich, dass der zurückgegebene Wert subtotalRounded
entweder 2,1999999999999997 oder 3,1999999999999997 statt 2,2 und 3,2 ist. Dies scheint bei Werten von 4 Stunden 12 Minuten oder mehr oder 1 Stunde 12 Minuten oder weniger nicht zu passieren.
Wie auch immer, ich bin völlig ratlos warum Rundungsfehler nur mit diesen beiden Werten auftritt. Hat jemand irgendwelche Vorschläge oder Kommentare? Benutze ich die Methode falsch oder gibt es einen besseren Weg?
Dies scheint genau wie ein Fließkomma "Fehler" (Zitate absichtlich).Wenn Sie keine Rundungsprobleme haben möchten (besonders im Dezimalbruch): Verwenden Sie double - so nicht: arbeiten Sie in Minuten (oder Sekunden, oder welche Genauigkeit Sie wollen) als Integer, oder wenn Sie wirklich einen verwenden möchten Dezimal so: Konvertieren von Minuten (Sekunden, was auch immer) in 'Dezimal' –