Frage

Ich versuche, eine Zahl gerundet werden, um es der ersten Dezimalstelle und die verschiedenen MidpointRounding Berücksichtigung der gewählten Optionen, das gut zu funktionieren scheint. Ein Problem entsteht, wenn, wenn diese Zahl hat sunsequent Dezimalstellen, die arithmetisch die Rundung beeinflussen würden.

Ein Beispiel:

Mit 0.1, 0.11..0.19 und 0.141..0.44 es funktioniert:

Math.Round(0.1, 1) == 0.1
Math.Round(0.11, 1) == 0.1
Math.Round(0.14, 1) == 0.1
Math.Round(0.15, 1) == 0.2
Math.Round(0.141, 1) == 0.1

Aber mit 0.141..0.149 es gibt immer 0.1, obwohl 0.146..0.149 sollte rund um 0.2:

Math.Round(0.145, 1, MidpointRounding.AwayFromZero) == 0.1
Math.Round(0.146, 1, MidpointRounding.AwayFromZero) == 0.1
Math.Round(0.146, 1, MidpointRounding.ToEven) == 0.1
Math.Round(0.146M, 1, MidpointRounding.ToEven) == 0.1M
Math.Round(0.146M, 1, MidpointRounding.AwayFromZero) == 0.1M

Ich habe versucht, mit einer Funktion zu kommen, dass dieses Problem lösen, und es funktioniert gut für diesen Fall, aber natürlich ist es nicht glamourös, wenn Sie rund versuchen, das heißt 0.144449 zu seinem ersten Nachkommastelle (was 0.2 sein sollte, aber Ergebnisse 0.1.) (das nicht funktioniert mit Math.Round () entweder.)

private double "round"(double value, int digit)
{
    // basically the old "add 0.5, then truncate to integer" trick
    double fix = 0.5D/( Math.Pow(10D, digit+1) )*( value >= 0 ? 1D : -1D );
    double fixedValue = value + fix;

    // 'truncate to integer' - shift left, round, shift right
    return Math.Round(fixedValue * Math.Pow(10D, digit)) / Math.Pow(10D, digit);
}

Ich gehe davon eine Lösung wäre, alle Ziffern aufzuzählen, findet den ersten Wert größer als 4 und dann um, oder sonst abrunden. Problem 1: Das scheint idiotisch, Problem 2: Ich habe keine Ahnung, wie die Ziffern aufzuzählen ohne Unmenge von Multiplikationen und subtractios

.

Lange Rede kurzer Sinn: Was ist der beste Weg, das zu tun

War es hilfreich?

Lösung

Math.Round() verhält richtig.

Wenn Sie Standard Mittelpunkt Runde Leistung erbringt, die Sie nie mehr als 1 Nachkommastelle suchen müssen darüber hinaus, wo Sie zu runden. Wenn Sie auf das nächste Zehntel runden, dann müssen Sie nie über die zweite Stelle nach dem Komma suchen.

Die Idee mit Mittelpunkt Rundung ist, dass die Hälfte des in-zwischen den Zahlen aufrunden sollen und die Hälfte soll abrunden. Also für Zahlen zwischen 0,1 und 0,2, die Hälfte davon sollte auf 0,1 abzurunden und die Hälfte sollte rund 0,2. Der Mittelpunkt zwischen diesen beiden Zahlen ist 0,15, so daß die Schwelle ist zum Aufrunden. 0.146 weniger als 0,15, daher ist es auf 0,1 abrunden müssen.

                    Midpoint
0.10                  0.15                  0.20
 |----------------|----|---------------------|
                0.146
       <---- Rounds Down

Andere Tipps

Ich verstehe nicht, was Sie versuchen, hier zu erreichen. 0,149 gerundet auf eine Dezimalstelle is 0,1, nicht 0,2

Rounding ist nicht ein iterativer Prozess, Sie rund um nur einmal.

So 0,146 gerundet auf 1 Dezimalstelle is 0.1.

Sie dies nicht tun:

0.146 --> 0.15
0.15 -->  0.2

Sie tun nur das:

0.146 --> 0.1

Ansonsten folgende:

0.14444444444444446

würde auch rund 0,2, aber es funktioniert nicht, und sollte nicht.

Versuchen Sie nicht, und die Verbindung der Rundung ‚Fehler‘. Das ist, was Sie zu tun versuchen.

0,146 sollte Runde bis auf 0,1, wenn Sie auf eine Dezimalstelle gehen.

Durch sie .15 Runden zuerst, dann wieder auf 0,2 sind Sie nur mehr die Einführung Rundungsfehler, nicht weniger.

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