Я хочу получить число после десятичной точки в виде целого числа. Например, только 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);
Решение без проблемы округления:
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);
}
}
Это может быть накладными расходами, но должно работать.
double yourDouble = 1.05;
string stringForm = yourDouble.ToString();
int dotPosition = stringForm.IndexOf(".");
decimal decimalPart = Decimal.Parse("0" + stringForm.Substring(dotPosition));
Console.WriteLine(decimalPart); // 0.05
string input = "0.55";
var regex1 = new System.Text.RegularExpressions.Regex("(?<=[\\.])[0-9]+");
if (regex1.IsMatch(input))
{
string dp= regex1.Match(input ).Value;
}
Вы можете удалить точку .с двойного числа, которое вы пытаетесь получить десятичные дроби, используя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]))