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

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

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

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

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


person invarbrass    schedule 22.05.2012    source источник
comment
Лучшим подходом может быть вообще не использовать десятичную дробь, а использовать int/long, представляющий ваше значение, умноженное на 100.   -  person Rawling    schedule 22.05.2012
comment
Остерегайтесь необычных значений. Максимальное значение для десятичной дроби составляет ~ 7,9e28. Максимальное значение для int составляет ~ 2e9 (значительно меньше). Даже длинный идет только до ~ 9e18. Поэтому, если вы знаете, что значение всегда будет = 0, вы можете использовать ulong, который доходит до ~ 18e18, что дает немного больше свободы действий.   -  person Davio    schedule 22.05.2012
comment
Следующий ответ на аналогичный вопрос может удовлетворить эти потребности в дробной части:   -  person Frédéric    schedule 28.04.2014


Ответы (5)


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

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

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

person SOReader    schedule 27.01.2014
comment
Попробуйте использовать это: var FileMinorPartClient = (int)(100.0m * (clientFileVersion - Math.Floor(clientFileVersion))); Я получаю: Оператор «*» не может быть применен к операндам типа «десятичный» и «двойной» (clientFileVersion — это двойной, а-ля 1.4) - person B. Clay Shannon; 20.02.2014
comment
@ B.ClayShannon Так сказано, потому что вы не можете смешивать эти два. Либо измените 100.0m на 100.0, либо убедитесь, что decimalValue относится к типу decimal. - person SOReader; 20.02.2014

decimal fraction = doubleNumber - Math.Floor(doubleNumber) 

или что-то типа того.

person OMARY    schedule 08.06.2015

Как насчет:

int fraction = (int) ((decimalValue - integral) * 100);
person Barry Kaye    schedule 22.05.2012

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

Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000)
person Aamol    schedule 24.06.2015

person    schedule
comment
Очень хорошее использование оператора модуля для десятичных чисел. Я не ожидал, что это сработает, но это красиво (и быстро) :) - person Gone Coding; 27.09.2017
comment
Я второй @GoneCoding, но ОП упоминает, что обе части должны быть целыми числами. - person Gerold Broser; 28.07.2019
comment
@GeroldBroserreinstatesMonica Что касается переменной dPart, вы можете просто преобразовать ее в integer. - person vchan; 02.04.2020