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

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

 Rango23 окт. 2012 г., 22:15
2,50 - это всего лишь 2,5. Я полагаю, вы говорите о струнах.
 tmesser23 окт. 2012 г., 22:16
Пример использования имеет большое значение для получения качественных ответов, в следующий раз.
 Greg23 окт. 2012 г., 22:16
Вы всегда возвращаете первые две цифры после запятой? Является ли входdecimal, float, string...
 user109554923 окт. 2012 г., 22:18
да только буксировочные цифры, ввод десятичный
 philologon15 янв. 2018 г., 16:44
Команда разработчиков C # должна быть смущена (и принять меры), что у этой очень распространенной операции нет ни одной Math.function, такой как Math.DecimalPart (double x) или чего-то еще. Слишком много «пробовали ли вы, задумывались ли вы об этом» для чего-то, что многие из нас должны делать часто.

Ответы на вопрос(15)

var decPlaces = (int)(((decimal)number % 1) * 100);

 tmesser14 июл. 2015 г., 07:21
@orad Хороший вызов - числа с плавающей запятой всегда имеют эти небольшие неточности, поэтому приведение их довольно разумно, чтобы обеспечить согласованное поведение. Я обновлю свой ответ, хотя Matterai все еще более технически правильный.
 orad13 июл. 2015 г., 20:03
(318.40d % 1) * 100 выходы39.9999999999977Вы можете использовать приведение, чтобы обойти ошибку округления:var decPlaces = (int)(((decimal)number % 1) * 100);

int y = value.Split('.')[1];?

Split() Функция разбивает значение на отдельный контент и1 выводит 2-е значение после.

 dmarra18 февр. 2016 г., 20:02
Потому что вы приводите его к строке для манипулирования строкой. Я не думаю, что вы понимаете, насколько это медленно и расточительно.
 orad13 июл. 2015 г., 21:49
Это будет работать:Int32.Parse((12.05123d.ToString("0.00").Split('.')[1]))

Это очень просто

       float moveWater =  Mathf.PingPong(theTime * speed, 100) * .015f;
       int    m = (int)(moveWater);
       float decimalPart= moveWater -m ;

       Debug.Log(decimalPart);
var result = number.ToString().Split(System.Globalization.NumberDecimalSeparator)[2]

к int) и предположить, что у числа есть «.» где-то.

возможно, с Math.truncate ()

double value = 1.761
double decPart = value - Math.truncate(value)
int last2digits = num - (int) ((double) (num /  100) * 100);
 orad13 июл. 2015 г., 20:27
Вопрос в том, чтобы получить первые 2 десятичных знака. Для номера318.401567d ваше решение выводит0.401567 где40 ожидается.

Лучший путь -

                int result = (int)((value - (int)value) * 100);
        Console.WriteLine(result);

Выход -

56
 orad13 июл. 2015 г., 20:44
За10.20 это будет выводить19, Смотри мой ответ.
 mafu02 мая 2015 г., 15:03
Не тестировал, но страдает от неточности поплавка, нет?

чем подход Math.Truncate:

double frac = value % 1;
    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;
    }

лучший из лучших способов это:

var floatNumber = 12.5523;

var x = floatNumber - Math.Truncate(floatNumber);

результат вы можете конвертировать как хотите

 johnc01 окт. 2014 г., 06:57
Это должен быть принятый ответ, решение по математике на вопрос по математике, без всего этого утомительного осмысления манипуляций со строками
 philologon05 янв. 2015 г., 03:49
Последний комментарий: использование Math.Truncate было целью автора библиотеки Math для такого рода ситуаций. Ответ @Matterai должен быть принятым.
 Dherik25 нояб. 2014 г., 16:20
Я думаю, что у этого решения есть «проблема». Если floatNumber был «10.2», переменная x будет выглядеть примерно как «0.19999999999999929». Даже если это работает как ожидалось, результат будет «0,2», а не «2».
 philologon05 янв. 2015 г., 03:43
Значения @Dherik Float и Double всегда имеют небольшие ошибки при вычитании в последних десятичных разрядах. Вы не должны рассматривать их как значимые. Если вам действительно нужна такая точность, вы должны использовать десятичный тип. Если вы не можете переключиться на десятичную (или просто не хотите), то вам следует как-то отслеживать ожидаемую точность и учитывать ее в операциях сравнения. Я обычно использую 4 знака после запятой, но могут быть и исключения.
 philologon05 янв. 2015 г., 03:43
Изmsdn.microsoft.com/en-us/library/... : «Поскольку некоторые числа не могут быть представлены точно как дробные двоичные значения, числа с плавающей запятой могут только приближать действительные числа»
Решение Вопроса

Обновленный ответ

Здесь я даю 3 подхода для одного и того же.

[1] Математическое решение с использованиемMath.Truncate

 var float_number = 12.345;
 var result = float_number - Math.Truncate(float_number);

// ввод: 1,05
// вывод: "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/

 tmesser25 июн. 2014 г., 20:40
Это решение примерно на два порядка медленнее, чем любое другое решение на этой странице, и на четыре порядка медленнее, чем мой собственный ответ.
 Manfred Radlwimmer09 авг. 2017 г., 09:39
@Kiquenet Потому что это 7-я ревизия. Это был оригинальный ответ:stackoverflow.com/revisions/19374418/1
 Yury Schkatula18 мар. 2015 г., 14:14
Это решение зависит от культуры. Например, в русском и англо-американском языках используются разные десятичные разделители (запятая и точка соответственно). Так что этот код не будет работать в других культурах.
 Abel17 янв. 2016 г., 14:04
Это решение распадается на., который не всегда является десятичным разделителем (т.е. в Европе десятичный разделитель,). Вы должны добавитьCultureInfo.Invariant сделать его международным. Хотя проще в использованииx - Math.Truncate(x) и вы волшебны на этот результат.
 Alex Beynenson13 февр. 2014 г., 15:15
Будьте осторожны с ToString (), так как он не будет возвращать десятичных частей для целых чисел, то есть, если MyValue равно 3, MyValue.ToString () вернет «3», так что Split ('.') [1] будет выбрасывать. Подумайте об указании формата в явном виде нужного вам количества десятичных разрядов: MyValue.ToString ("F2"). Split ('.') [1]

который я написал для аналогичной ситуации. Моя заявка получит числа в формате 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 в строку, чтобы вы могли выполнять необходимые операции над ней

Подумайте о двойном_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+)") Кто-то поправит меня, если я здесь не прав

 Picrofo Software23 окт. 2012 г., 22:45
Не очень популяренRegex.Match но я получил следующую ошибку при попытке получить значение десятичнойArgumentException was unhandled: parsing "\.(?\d+)" - Unrecognized grouping construct.

Решение без задачи округления:

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.

 Ziggler07 мая 2018 г., 23:28
Я использовал это ... 10.2d.ToString ("0.00", CultureInfo.InvariantCulture) .Split ('.') [1]
 quetzalcoatl02 февр. 2018 г., 23:05
Бонусные баллы за чтение вопроса, а не только название!
 Ivandro Ismael26 авг. 2016 г., 16:13
Недурно для модов

Ваш ответ на вопрос