it-swarm.com.de

Dezimalzahl abschneiden, nicht abrunden

Mögliches Duplikat:
c # - Wie runde ich einen Dezimalwert auf 2 Dezimalstellen (für die Ausgabe auf einer Seite)

Ich möchte die Dezimalstellen wie unten abschneiden

d.h.

  • 2,22939393 -> 2,229
  • 2,22977777 -> 2,229
35
Phantom Yoda
double d = 2.22977777;
d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ;

Dies funktioniert natürlich nicht, wenn Sie versuchen, Rundungsfehler abzuschneiden, aber es sollte mit den Werten, die Sie in Ihren Beispielen angegeben haben, gut funktionieren. In den ersten beiden Antworten auf diese Frage erfahren Sie, warum dies manchmal nicht funktioniert.

17
Bill the Lizard

Sie können Math.Round verwenden:

decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229

Oder Sie können ToString mit dem N3 numerisches Format verwenden.

string roundedNumber = number.ToString("N3");

EDIT: Da Sie keine Rundung wünschen, können Sie einfach Math.Truncate :

Math.Truncate(2.22977777 * 1000) / 1000; //Returns 2.229
60
CMS

Eine Funktion zum Abschneiden einer beliebigen Anzahl von Dezimalstellen:

public decimal Truncate(decimal number, int digits)
{
  decimal stepper = (decimal)(Math.Pow(10.0, (double)digits));
  int temp = (int)(stepper * number);
  return (decimal)temp / stepper;
}
8
Carl Hörberg

Hier ist eine Erweiterungsmethode, die nicht unter einem Ganzzahlüberlauf leidet (wie einige der obigen Antworten). Es werden auch einige Potenzen von 10 für die Effizienz zwischengespeichert.

static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 };
public static double Truncate(this double x, int precision)
{
    if (precision < 0)
        throw new ArgumentException();
    if (precision == 0)
        return Math.Truncate(x);
    double m = precision >= pow10.Length ? Math.Pow(10, precision) : pow10[precision];
    return Math.Truncate(x * m) / m;
}
7
Glenn Slayden

Dies ähnelt dem obigen Vorschlag von TcK, verwendet jedoch math.truncate anstelle von int-Konvertierungen

VB: Aber du wirst auf die Idee kommen

Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double 
dim power as decimal = Math.Pow(10, decimalplaces)
return math.truncate(totruncate * power) / power
end function
3
Jim

Versuche dies

double d = 2.22912312515;
int demention = 3;
double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention)) / Math.Pow(10.0, demention);
0
Pavlo Neyman

In welchem ​​Format möchten Sie die Ausgabe?

Wenn Sie mit einer Zeichenfolge zufrieden sind, geben Sie den folgenden C # -Code ein:

double num = 3.12345;
num.ToString("G3");

Das Ergebnis ist "3.12".

Dieser Link kann hilfreich sein, wenn Sie .NET verwenden. http://msdn.Microsoft.com/en-us/library/dwhawy9k.aspx

Ich hoffe, das hilft .... aber es ist schwierig, eine geeignete Lösung vorzuschlagen, es sei denn, Sie identifizieren die von Ihnen verwendete Sprache und das Format, in dem Sie die Ausgabe wünschen.

0
mezoid

Vielleicht könnte eine andere schnelle Lösung sein:

>>> float("%.1f" % 1.00001)
1.0
>>> float("%.3f" % 1.23001)
1.23
>>> float("%.5f" % 1.23001)
1.23001
0
magicrebirth