Ответ 1
decimal fraction = (decimal)2.78;
int iPart = (int)fraction;
decimal dPart = fraction % 1.0m;
Я пытаюсь извлечь интегральную и дробную части из десятичного значения (обе части должны быть целыми):
decimal decimalValue = 12.34m;
int integral = (int) decimal.Truncate(decimalValue);
int fraction = (int) ((decimalValue - decimal.Truncate(decimalValue)) * 100);
(для моей цели десятичные переменные будут содержать до двух знаков после запятой)
Есть ли лучшие способы достижения этого?
decimal fraction = (decimal)2.78;
int iPart = (int)fraction;
decimal dPart = fraction % 1.0m;
decimal fraction = doubleNumber - Math.Floor(doubleNumber)
или что-то в этом роде.
Попробуйте математическое определение:
var fraction = (int)(100.0m * (decimalValue - Math.Floor(decimalValue)));
Хотя это не лучше в смысле производительности, но, по крайней мере, работает для отрицательных чисел.
Как насчет:
int fraction = (int) ((decimalValue - integral) * 100);
Для извлечения фракции вы можете использовать это решение:
Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000)
как использовать функцию 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' к концу любой десятичной части, которая имеет только одну цифру.