Я хочу получить число после десятичной точки в виде целого числа. Например, только 05 от 1,05 или от 2,50 всего 50 не 0,50
Получите десятичную часть из двойной
Ответ 1
Обновленный ответ
Здесь я даю три подхода для одного и того же.
[1] Математическое решение с использованием Math.Truncate
var float_number = 12.345;
var result = float_number - Math.Truncate(float_number);
//ввод: 1.05
//output: "0.050000000000000044"
//ввод: 10.2
//output: 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/
Ответ 2
лучший из лучших способов:
var floatNumber = 12.5523;
var x = floatNumber - Math.Truncate(floatNumber);
результат вы можете преобразовать, но вам нравится
Ответ 3
var decPlaces = (int)(((decimal)number % 1) * 100);
Это предполагает, что ваш номер имеет только два десятичных знака.
Ответ 4
Лучший способ -
double value = 10.567;
int result = (int)((value - (int)value) * 100);
Console.WriteLine(result);
Вывод -
56
Ответ 5
Самый простой вариант, возможно, с Math.truncate()
double value = 1.761
double decPart = value - Math.truncate(value)
Ответ 6
Решение без проблемы округления:
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
.
Update:
Следующее будет работать, если обрабатывать его как строку (построив ответ на @SearchForKnowledge).
10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]
Затем вы можете использовать Int32.Parse
, чтобы преобразовать его в int.
Ответ 7
int last2digits = num - (int) ((double) (num / 100) * 100);
Ответ 8
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;
}
Ответ 9
Здесь метод расширения, который я написал для аналогичной ситуации. Мое приложение получало числа в формате 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);
}
}
Ответ 10
var result = number.ToString().Split(System.Globalization.NumberDecimalSeparator)[2]
Возвращает его как строку (но вы всегда можете отбросить это обратно в int) и предполагает, что число имеет значение "." где-то.
Ответ 11
Вы можете удалить точку .
из двойника, с которой вы пытаетесь получить десятичные знаки, используя функцию Remove()
после преобразования double в строку, чтобы вы могли выполнять требуемые операции
Рассмотрим наличие двойного _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
Ответ 12
Это очень просто
float moveWater = Mathf.PingPong(theTime * speed, 100) * .015f;
int m = (int)(moveWater);
float decimalPart= moveWater -m ;
Debug.Log(decimalPart);
Ответ 13
Используйте регулярное выражение: Regex.Match("\.(?\d+)")
Кто-то исправит меня, если я ошибаюсь здесь
Ответ 14
Почему бы не использовать int y = value.Split('.')[1];
?
Функция Split()
разделяет значение на отдельный контент, а 1
выводит второе значение после .