Frage

Ich sehe mit Math.Round nicht das erwartete Ergebnis.

return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97

Soweit ich MidpointRounding.ToEven verstehe, sollte die 5 an der Tausendstelposition dazu führen, dass die Ausgabe 99,96 beträgt.Ist das nicht der Fall?

Ich habe es sogar versucht, aber es ergab ebenfalls 99,97:

return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100;

Was vermisse ich

Danke!

War es hilfreich?

Lösung

Sie sind nicht wirklich im Mittelpunkt. MidpointRounding.ToEven zeigt an, dass, wenn Sie die Nummer haben 99,965 , das heißt, 99,96500000 [etc.], und Sie würden 99,96 erhalten. Da die Nummer, die Sie Math.Round vorbei sind über diesen Mittelpunkt ist, wird es Aufrundung.

Wenn Sie Ihre Nummer wollen 99,96 abrunden, dies zu tun:

// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);

Und hey, hier ist eine handliche kleine Funktion, die oben für die allgemeinen Fälle zu tun:

// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
    double multiplier = Math.Pow(10.0, digits + 1);
    double truncated = Math.Truncate(value * multiplier) / multiplier;
    return Math.Round(truncated, digits, mode);
}

Andere Tipps

Es rundet nur auf 99,96, wenn Sie auf dem Mittelpunkt sind selbst, das heißt 99,965:

C:\temp>ipy
IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import Math, MidpointRounding
>>> Math.Round(99.9651, 2, MidpointRounding.ToEven)
99.97
>>> Math.Round(99.965, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.9649, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.975, 2, MidpointRounding.ToEven)
99.98
>>>

Der MidpointRounding Wert nur dann ins Spiel kommt, wenn Sie versuchen, einen Wert zu runden, deren niedrigstwertige Ziffer ist genau 5. Mit anderen Worten würde der Wert muß 99.965 wird Ihr gewünschtes Ergebnis zu erhalten . Da dies hier nicht der Fall ist, beobachten Sie einfach die Standardrundung Mechanismus. Sehen Sie sich die MSDN-Seite für weitere Informationen.

Hier die Ergebnisse, die etwas Licht auf das Thema werfen:

Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven);      // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96

Der Mittelpunkt ist genau 5 ... nicht 535.789, nicht 499999.

Der Mittelpunkt Rundung nur betrachtet wird, wenn der Wert zwischen Ihren beiden Fällen ist.

In Ihrem Fall ist es nicht „5“, es ist „535 ...“, es ist also größer als der Mittelpunkt, und Routinen zu 0,96. Um Ihre das Verhalten erwarten, müssten Sie auf die dritte Dezimalstelle trunctate, dann um mit MidpointRounding.ToEven.

Math.Round 'runden einen Dezimalwert für eine bestimmte Anzahl von Bruchteilern.' Bei Runden 99,96500000,2 Runden auf 99,96 und 99,96500001 auf 99,67.Es rundet den vollen Wert.

Wenn es nach mir ginge, würde ich Math.Round() nicht, denn das ist nicht das, was Sie versuchen zu erreichen.

Dies ist, was ich tun würde:

double num = 99.96535789;
double percentage = Math.Floor(100 * num) / 100;  

, die viel leichter zu lesen ist und ist eher ein mathematischer Ansatz.
Ich multiplizieren Sie die Anzahl von 100, jetzt habe ich 9996.535789.
Dann Boden es, die als Rundung deutlich unterschiedlich ist, zurückzukehren, um die kleinste ganze Zahl am nächsten an der Zahl, 9996 zu erhalten.
Ich teile dann durch 100 die erforderliche 99.96 zu bekommen.

P. S.
Boden ist das Gegenteil von Decke , die gibt die größte ganze Zahl am nächsten an der Zahl.
So ist die Obergrenze von 9996.535789 9997.
Beide sind anders als Rundung auf keine Dezimalstellen, die tatsächlich die nächste ganze Zahl auf die Zahl zurückgibt, ob es kleiner oder größer - je nachdem, was am nächsten ist; das ist, warum Sie wurden 99.97 bekommen, wenn Sie verwenden Rundung .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top