Ich möchte die Zahl nach dem Dezimalpunkt in Form einer Ganzzahl erhalten. Zum Beispiel nur 05 von 1,05 oder von 2,50 nur 50 nicht 0,50
decimal, float, string, ...?
Ich möchte die Zahl nach dem Dezimalpunkt in Form einer Ganzzahl erhalten. Zum Beispiel nur 05 von 1,05 oder von 2,50 nur 50 nicht 0,50
decimal, float, string, ...?
Antworten:
Aktualisierte Antwort
Hier gebe ich 3 Ansätze für das gleiche.
[1] Math Solution mit Math.Truncate
var float_number = 12.345;
var result = float_number - Math.Truncate(float_number);
// Eingabe: 1.05
// Ausgabe: "0.050000000000000044"
// Eingabe: 10.2
// Ausgabe: 0.19999999999999929
Wenn dies nicht das erwartete Ergebnis ist, müssen Sie das Ergebnis in die gewünschte Form ändern (aber Sie können möglicherweise einige Zeichenfolgenmanipulationen erneut durchführen.)
[2] unter Verwendung eines Multiplikators [der 10 hoch N (z. B. 10² oder 10³) ist, wobei N die Anzahl der Dezimalstellen ist]
// multiplier is " 10 to the power of 'N'" where 'N' is the number
// of decimal places
int multiplier = 1000;
double double_value = 12.345;
int double_result = (int)((double_value - (int)double_value) * multiplier);
// Ausgabe 345
Wenn die Anzahl der Dezimalstellen nicht festgelegt ist, kann dieser Ansatz zu Problemen führen.
[3] Verwenden von "Regular Expressions (REGEX)"
Wir sollten sehr vorsichtig sein, wenn wir Lösungen mit String schreiben. Dies wäre außer in einigen Fällen nicht vorzuziehen .
Wenn Sie einige Zeichenfolgenoperationen mit Dezimalstellen ausführen möchten, ist dies vorzuziehen
string input_decimal_number = "1.50";
var regex = new System.Text.RegularExpressions.Regex("(?<=[\\.])[0-9]+");
if (regex.IsMatch(input_decimal_number))
{
string decimal_places = regex.Match(input_decimal_number).Value;
}
// Eingabe: "1.05"
// Ausgabe: "05"
// Eingabe: "2.50"
// Ausgabe: "50"
// Eingabe: "0.0550"
// Ausgabe: "0550"
Weitere Informationen zu Regex finden Sie unter http://www.regexr.com/.
., was nicht immer das Dezimaltrennzeichen ist (dh in Europa ist das Dezimaltrennzeichen ,). Sie müssen hinzufügen CultureInfo.Invariant, um es international zu machen. Obwohl es einfacher ist, x - Math.Truncate(x)dieses Ergebnis zu verwenden und zu zaubern.
Das Beste vom Besten ist:
var floatNumber = 12.5523;
var x = floatNumber - Math.Truncate(floatNumber);
Ergebnis können Sie konvertieren, wie Sie möchten
var decPlaces = (int)(((decimal)number % 1) * 100);
Dies setzt voraus, dass Ihre Zahl nur zwei Dezimalstellen hat.
(318.40d % 1) * 100Ausgaben 39.9999999999977können Sie Casting verwenden, um den Rundungsfehler zu var decPlaces = (int)(((decimal)number % 1) * 100);
Lösung ohne Rundungsproblem:
double number = 10.20;
var first2DecimalPlaces = (int)(((decimal)number % 1) * 100);
Console.Write("{0:00}", first2DecimalPlaces);
Ausgänge: 20
Beachten Sie, dass die Ausgabe nicht dezimal erfolgt
19.
Ebenfalls:
318.40Ausgänge: 40(anstelle von 39)47.612345Ausgänge: 61(anstelle von 612345)3.01Ausgänge: 01(anstelle von 1)Wenn Sie mit Finanzzahlen arbeiten, z. B. wenn Sie in diesem Fall versuchen, den Cent- Teil eines Transaktionsbetrags zu erhalten, verwenden Sie immer den
decimalDatentyp.
Aktualisieren:
Das Folgende funktioniert auch, wenn es als Zeichenfolge verarbeitet wird (basierend auf der Antwort von @ SearchForKnowledge).
10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]
Sie können es dann verwenden Int32.Parse, um es in int zu konvertieren.
Ich denke, dieser Thread wird alt, aber ich kann nicht glauben, dass niemand Math.Floor erwähnt hat
//will always be .02 cents
(10.02m - System.Math.Floor(10.02m))
double fract(double x) { return x - System.Math.Floor(x); }
var result = number.ToString().Split(System.Globalization.NumberDecimalSeparator)[2]
Gibt es als Zeichenfolge zurück (aber Sie können es jederzeit in ein int umwandeln) und nimmt an, dass die Zahl ein "." irgendwo.
int last2digits = num - (int) ((double) (num / 100) * 100);
318.401567dIhrer Lösungsausgaben, 0.401567wo 40erwartet wird.
public static string FractionPart(this double instance)
{
var result = string.Empty;
var ic = CultureInfo.InvariantCulture;
var splits = instance.ToString(ic).Split(new[] { ic.NumberFormat.NumberDecimalSeparator }, StringSplitOptions.RemoveEmptyEntries);
if (splits.Count() > 1)
{
result = splits[1];
}
return result;
}
Hier ist eine Erweiterungsmethode, die ich für eine ähnliche Situation geschrieben habe. Meine Bewerbung würde Zahlen im Format 2,3 oder 3,11 erhalten, wobei die ganzzahlige Komponente der Zahl Jahre und die gebrochene Komponente Monate darstellt.
// Sample Usage
int years, months;
double test1 = 2.11;
test1.Split(out years, out months);
// years = 2 and months = 11
public static class DoubleExtensions
{
public static void Split(this double number, out int years, out int months)
{
years = Convert.ToInt32(Math.Truncate(number));
double tempMonths = Math.Round(number - years, 2);
while ((tempMonths - Math.Floor(tempMonths)) > 0 && tempMonths != 0) tempMonths *= 10;
months = Convert.ToInt32(tempMonths);
}
}
Sie können den Punkt .aus dem Doppel entfernen, bei dem Sie versuchen, die Dezimalstellen aus der Verwendung von zu erhaltenRemove() Funktion zu nachdem Sie das Double in einen String konvertiert haben, damit Sie die erforderlichen Operationen ausführen können
Wenn Sie einen doppelten _DoubleWert von haben 0.66781, zeigt der folgende Code nur die Zahlen nach dem Punkt an, .die sind66781
double _Double = 0.66781; //Declare a new double with a value of 0.66781
string _Decimals = _Double.ToString().Remove(0, _Double.ToString().IndexOf(".") + 1); //Remove everything starting with index 0 and ending at the index of ([the dot .] + 1)
Eine andere Lösung
Sie können auch die Klasse verwenden, die Pathplattformübergreifend Operationen an Zeichenfolgeninstanzen ausführt
double _Double = 0.66781; //Declare a new double with a value of 0.66781
string Output = Path.GetExtension(D.ToString()).Replace(".",""); //Get (the dot and the content after the last dot available and replace the dot with nothing) as a new string object Output
//Do something
Verwenden Sie eine Regex: Regex.Match("\.(?\d+)")Jemand korrigiert mich, wenn ich hier falsch liege
Regex.Matchaber ich habe den folgenden Fehler erhalten, als ich versucht habe, den Wert der Dezimalstelle zu erhaltenArgumentException was unhandled: parsing "\.(?\d+)" - Unrecognized grouping construct.
Es ist sehr einfach
float moveWater = Mathf.PingPong(theTime * speed, 100) * .015f;
int m = (int)(moveWater);
float decimalPart= moveWater -m ;
Debug.Log(decimalPart);
Warum nicht verwenden int y = value.Split('.')[1];?
Die Split()Funktion teilt den Wert in separaten Inhalt auf und 1gibt den 2. Wert nach dem aus.
Int32.Parse((12.05123d.ToString("0.00").Split('.')[1]))