Я заметил, что.NET имеет некоторое броское/неинтуитивное поведение когда дело доходит до десятичных чисел и конечных нулей.
0m == 0.000m //true
0.1m == 0.1000m //true
но
(0m).ToString() == (0.000m).ToString() //false
(0.1m).ToString() == (0.1000m).ToString() //false
Я знаю о необходимости соответствовать стандарту CLI ECMA. Однако я хотел бы знать, существует ли встроенный способ усечь конечные нули для десятичного значения, не проходя строковое представление (.ToString ("G29") и проанализировать назад прием, работал бы, но ни быстрое ни изящное решение)?
Какие-либо идеи?Большое спасибо.
Мне это не очень нравится, но работает (по крайней мере, для некоторого диапазона значений) ...
static decimal Normalize(decimal value)
{
long div = 1;
while(value - decimal.Truncate(value) != 0)
{
div *= 10;
value *= 10;
}
if(div != 1) {
value = (decimal)(long)value / div;
}
return value;
}
Используйте строку формата для указания вывода ToString():
(0.1m).ToString("0.#") -> "0.1"
(0.10000m).ToString("0.#") -> "0.1"
Используйте "0" в формате для указания цифры или не значащего 0, используйте "#" для указания значащей цифры или подавления не значащего 0.
Редактировать: Я предполагаю, что вас беспокоит визуальное (строковое) представление числа - если нет, я удалю свой ответ.