Разделить десятичную переменную на интегральную и дробную части

Я пытаюсь извлечь интегральную и дробную части из десятичного значения (обе части должны быть целыми):

decimal decimalValue = 12.34m;
int integral = (int) decimal.Truncate(decimalValue);
int fraction = (int) ((decimalValue - decimal.Truncate(decimalValue)) * 100);

(для моей цели десятичные переменные будут содержать до двух знаков после запятой)

Есть ли лучшие способы достижения этого?

Ответы

Ответ 1

       decimal fraction = (decimal)2.78;
        int iPart = (int)fraction;
        decimal dPart = fraction % 1.0m;

Ответ 2

decimal fraction = doubleNumber - Math.Floor(doubleNumber) 

или что-то в этом роде.

Ответ 3

Попробуйте математическое определение:

var fraction = (int)(100.0m * (decimalValue - Math.Floor(decimalValue)));

Хотя это не лучше в смысле производительности, но, по крайней мере, работает для отрицательных чисел.

Ответ 4

Как насчет:

int fraction = (int) ((decimalValue - integral) * 100);

Ответ 5

Для извлечения фракции вы можете использовать это решение:

Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000)

Ответ 6

как использовать функцию toString, а затем разбить на десятичную точку, то есть:

[edit] быстрый класс/метод для тестирования:

public class Test
{
    public struct FractionSplit
    {
        public int BeforeDecimal;
        public int AfterDecimal;
    }

    public FractionSplit SplitDecimal(decimal decimalValue, 
                                      int decimalPrecision = 2)
    {
        // now do the split - the apres decimal precision defined by 
        // the format function which defaults to 2 places i.e. "0.00"
        string splitValue = decimalValue.ToString(string.Format("0.{0}", 
            new String('0', decimalPrecision)), CultureInfo.InvariantCulture);
        string[] splitParts = splitValue.Split('.');

        // now factor out derived splits as ints into struct
        var fractionSplit = new FractionSplit
        {
            BeforeDecimal = int.Parse(splitParts[0]), 
            AfterDecimal = int.Parse(splitParts[1])
        };

        return fractionSplit;
    }
}

Использование:

Test test = new Test();
var result = test.SplitDecimal(12.1m);

согласно комментарию Дана, это действительно приведет к выводу, что 12.1 возвращает 12 и 10 в качестве итоговых целых чисел. Правильно ли это? - кто знает, но на данный момент покрывает этот вариант использования. Это связано с частью ToString ( "0. {0}" ), которая по умолчанию добавляет '0' к концу любой десятичной части, которая имеет только одну цифру.