Я хочу отримати число після десяткової крапки у вигляді цілого числа. Наприклад, лише 05 з 1,05 або з 2,50 лише 50, а не 0,50
decimal, float, string, ...?
Я хочу отримати число після десяткової крапки у вигляді цілого числа. Наприклад, лише 05 з 1,05 або з 2,50 лише 50, а не 0,50
decimal, float, string, ...?
Відповіді:
Оновлена відповідь
Тут я даю 3 підходи для того самого.
[1] Математичне рішення за допомогою Math.Truncate
var float_number = 12.345;
var result = float_number - Math.Truncate(float_number);
// вхід: 1,05
// вихід: "0,050000000000000044"
// вхід: 10.2
// вихід: 0.19999999999999929
Якщо це не той результат, який ви очікуєте, то вам доведеться змінити результат на потрібну форму (але ви можете знову виконати деякі маніпуляції з рядками).
[2] з використанням множника [який дорівнює 10 в степені N (наприклад, 10² або 10³), де N - кількість знаків після коми]
// 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);
// вихід 345
Якщо кількість десяткових знаків не визначена, тоді такий підхід може створити проблеми.
[3] за допомогою "Регулярних виразів (REGEX)"
нам слід бути дуже обережними під час написання рішень рядком. Це не було б кращим, за винятком деяких випадків.
Якщо ви збираєтеся робити кілька рядкових операцій з десятковою комою, то це було б кращим
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;
}
// вхід: "1,05"
// вихід: "05"
// вхід: "2.50"
// вихід: "50"
// вхід: "0,0550"
// вихід: "0550"
Ви можете дізнатись більше про Regex на http://www.regexr.com/
., який не завжди є десятковим роздільником (тобто в Європі десятковий роздільник є ,). Вам потрібно додати, CultureInfo.Invariantщоб зробити його міжнародним. Хоча простіше просто використовувати x - Math.Truncate(x)і робити магію на цьому результаті.
найкращим із найкращих способів є:
var floatNumber = 12.5523;
var x = floatNumber - Math.Truncate(floatNumber);
результат ви можете конвертувати як завгодно
var decPlaces = (int)(((decimal)number % 1) * 100);
Це передбачає, що ваше число має лише два знаки після коми.
(318.40d % 1) * 100виходи 39.9999999999977, ви можете використовувати кастинг, щоб обійти помилку округлення:var decPlaces = (int)(((decimal)number % 1) * 100);
Існує більш чисте та швидше рішення, ніж підхід "Math.Truncate":
double frac = value % 1;
Рішення без проблеми округлення:
double number = 10.20;
var first2DecimalPlaces = (int)(((decimal)number % 1) * 100);
Console.Write("{0:00}", first2DecimalPlaces);
Виходи: 20
Зверніть увагу, якщо ми не зробимо десяткову, це виведе
19.
Також:
318.40виходів: 40(замість 39)47.612345виходів: 61(замість 612345)3.01виходів: 01(замість 1)Якщо ви працюєте з фінансовими цифрами, наприклад, якщо в цьому випадку ви намагаєтесь отримати центи частиною суми операції, завжди використовуйте
decimalтип даних.
Оновлення:
Наступне також буде працювати, якщо обробляти його як рядок (спираючись на відповідь @ SearchForKnowledge).
10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]
Потім ви можете використовувати Int32.Parseдля перетворення його в int.
Я думаю, ця тема старіє, але я не можу повірити, що ніхто не згадував 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]
Повертає це як рядок (але ви завжди можете повернути це назад до int) і припускає, що число має "." десь.
int last2digits = num - (int) ((double) (num / 100) * 100);
318.401567dвиведіть рішення, 0.401567де 40очікується.
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;
}
Ось метод розширення, який я писав для подібної ситуації. Моя заявка отримає числа у форматі 2.3 або 3.11, де цілочисельний компонент числа представляє роки, а дробовий компонент - місяці.
// 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);
}
}
Ви можете видалити крапку .з подвійного, який ви намагаєтесь отримати десяткові знаки від використання Remove()функції після перетворення подвійного в рядок, щоб ви могли виконувати необхідні операції з ним
Розгляньте можливість мати подвійне _Doubleзначення 0.66781, наступний код покаже лише цифри після крапки, .які є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)
Ще одне рішення
Ви також можете використовувати клас Path, який виконує операції над екземплярами рядків крос-платформенним способом
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
Використовуйте регулярний вираз: Regex.Match("\.(?\d+)")Хтось виправте мене, якщо я тут помиляюся
Regex.Matchале я отримав таку помилку при спробі отримати десяткове значенняArgumentException was unhandled: parsing "\.(?\d+)" - Unrecognized grouping construct.
Це дуже просто
float moveWater = Mathf.PingPong(theTime * speed, 100) * .015f;
int m = (int)(moveWater);
float decimalPart= moveWater -m ;
Debug.Log(decimalPart);
Чому б не використовувати int y = value.Split('.')[1];?
Split()Функція розбиває значення в окремий контент і 1виводить 2 - е значення після.
Int32.Parse((12.05123d.ToString("0.00").Split('.')[1]))