Подтвердить что ты не робот

Получите десятичную часть из двойной

Я хочу получить число после десятичной точки в виде целого числа. Например, только 05 от 1,05 или от 2,50 всего 50 не 0,50

4b9b3361

Ответ 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 выводит второе значение после .