Chcę otrzymać liczbę po kropce dziesiętnej w postaci liczby całkowitej. Na przykład tylko 05 od 1,05 lub od 2,50 tylko 50, a nie 0,50
decimal, float, string, ...?
Chcę otrzymać liczbę po kropce dziesiętnej w postaci liczby całkowitej. Na przykład tylko 05 od 1,05 lub od 2,50 tylko 50, a nie 0,50
decimal, float, string, ...?
Odpowiedzi:
Zaktualizowana odpowiedź
Tutaj podaję 3 podejścia do tego samego.
[1] Rozwiązanie matematyczne przy użyciu Math.Truncate
var float_number = 12.345;
var result = float_number - Math.Truncate(float_number);
// wejście: 1.05
// wyjście: "0.050000000000000044"
// wejście: 10.2
// wyjście: 0.19999999999999929
Jeśli nie jest to oczekiwany wynik, musisz zmienić wynik na żądaną formę (ale możesz ponownie wykonać pewne operacje na ciągach).
[2] używając mnożnika [który wynosi 10 do potęgi N (np. 10² lub 10³), gdzie N to liczba miejsc dziesiętnych]
// 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);
// wypisz 345
Jeśli liczba miejsc dziesiętnych nie zostanie ustalona, to podejście może powodować problemy.
[3] używając „Wyrażeń regularnych (REGEX)”
powinniśmy być bardzo ostrożni podczas pisania rozwiązań z użyciem stringów. Nie byłoby to preferowane z wyjątkiem niektórych przypadków.
Jeśli zamierzasz wykonywać operacje na łańcuchach z miejscami dziesiętnymi, byłoby to preferowane
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;
}
// wejście: "1.05"
// wyjście: "05"
// wejście: „2,50”
// wyjście: „50”
// wejście: „0,0550”
// wyjście: „0550”
więcej informacji na temat Regex można znaleźć na stronie http://www.regexr.com/
., który nie zawsze jest separatorem dziesiętnym (tj. W Europie separatorem dziesiętnym jest ,). Musisz CultureInfo.Invariantcoś dodać, żeby było międzynarodowe. Chociaż łatwiej jest po prostu użyć x - Math.Truncate(x)i zrobić magię na tym wyniku.
najlepszy z najlepszych sposobów to:
var floatNumber = 12.5523;
var x = floatNumber - Math.Truncate(floatNumber);
wynik, który możesz konwertować w dowolny sposób
var decPlaces = (int)(((decimal)number % 1) * 100);
Zakłada to, że Twój numer ma tylko dwa miejsca po przecinku.
(318.40d % 1) * 100wyjścia 39.9999999999977, możesz użyć rzutowania, aby obejść błąd zaokrąglania:var decPlaces = (int)(((decimal)number % 1) * 100);
Rozwiązanie bez problemu z zaokrągleniem:
double number = 10.20;
var first2DecimalPlaces = (int)(((decimal)number % 1) * 100);
Console.Write("{0:00}", first2DecimalPlaces);
Wyjścia: 20
Zauważ, że gdybyśmy nie rzutowali na liczbę dziesiętną, to wyświetli się
19.
Również:
318.40wyjść: 40(zamiast 39)47.612345wyjść: 61(zamiast 612345)3.01wyjść: 01(zamiast 1)Jeśli pracujesz z numerami finansowych, na przykład, jeśli w tym przypadku staramy się uzyskać centów część kwoty transakcji, należy zawsze używać
decimaltypu danych.
Aktualizacja:
Poniższe działania będą również działać, jeśli przetwarzają go jako ciąg (opierając się na odpowiedzi @ SearchForKnowledge).
10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]
Następnie możesz użyć, Int32.Parseaby przekonwertować go na int.
Myślę, że ten wątek się starzeje, ale nie mogę uwierzyć, że nikt nie wspomniał o Math.Floor
//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]
Zwraca to jako ciąg (ale zawsze można to rzutować z powrotem na liczbę int) i zakłada, że liczba ma znak „.” gdzieś.
int last2digits = num - (int) ((double) (num / 100) * 100);
318.401567dTwoje rozwiązanie wyświetla się 0.401567tam, gdzie 40jest oczekiwane.
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;
}
Oto metoda rozszerzenia, którą napisałem dla podobnej sytuacji. Moja aplikacja otrzymałaby liczby w formacie 2,3 lub 3,11, gdzie składnik całkowity liczby reprezentowanej przez lata, a składnik ułamkowy reprezentowałby miesiące.
// 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);
}
}
Możesz usunąć kropkę .z podwójnej liczby, którą próbujesz uzyskać ułamki dziesiętne, używając Remove()funkcji po konwersji podwójnej na ciąg, aby móc wykonać na niej wymagane operacje
Rozważ podwójną _Doublewartość 0.66781, poniższy kod pokaże tylko liczby po kropce, .które są66781
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)
Inne rozwiązanie
Możesz również użyć klasy, Pathktóra wykonuje operacje na wystąpieniach ciągów w sposób wieloplatformowy
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
Użyj wyrażenia regularnego: Regex.Match("\.(?\d+)")ktoś popraw mnie, jeśli się mylę
Regex.Matchale otrzymałem następujący błąd podczas próby uzyskania wartości dziesiętnejArgumentException was unhandled: parsing "\.(?\d+)" - Unrecognized grouping construct.
To bardzo proste
float moveWater = Mathf.PingPong(theTime * speed, 100) * .015f;
int m = (int)(moveWater);
float decimalPart= moveWater -m ;
Debug.Log(decimalPart);
Dlaczego nie używać int y = value.Split('.')[1];?
Split()Funkcja dzieli wartość w osobne i 1wysyłającym 2. wartości po.
Int32.Parse((12.05123d.ToString("0.00").Split('.')[1]))