Десятичное число - усеченные конечные нули - PullRequest
18 голосов
/ 26 апреля 2010

Я заметил, что в .NET есть странное / не интуитивное поведение, когда дело доходит до десятичных и конечных нулей.

0m == 0.000m //true
0.1m == 0.1000m //true

но

(0m).ToString() == (0.000m).ToString() //false
(0.1m).ToString() == (0.1000m).ToString() //false

Я знаю о необходимости соответствовать стандарту ECMA CLI. Однако я хотел бы знать, есть ли встроенный способ обрезать завершающие нули для десятичного значения без прохождения строкового представления (.ToString ("G29") и трюк синтаксического анализа обратно, но это не быстрое и не элегантное решение)

Есть идеи? Большое спасибо.

Ответы [ 3 ]

17 голосов
/ 02 ноября 2011

Я думаю, что вам нужно это (более подробно в моем ответе здесь ):

public static decimal Normalize(decimal value)
{
    return value/1.000000000000000000000000000000000m;
}
7 голосов
/ 26 апреля 2010

Используйте строку формата для указания вывода ToString ():

(0.1m).ToString("0.#") -> "0.1"
(0.10000m).ToString("0.#") -> "0.1"

Используйте «0» в формате, чтобы указать цифру или не значащее 0, используйте «#», чтобы указать значащую цифру, или подавьте не значащее 0.

Редактировать: Я предполагаю, что вас беспокоит визуальное (строковое) представление числа - если нет, я удалю свой ответ.

3 голосов
/ 26 апреля 2010

Мне не очень нравится, но это работает (по крайней мере, для некоторого диапазона значений) ...

    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;
    }
...