Десятичное число - усекает конечные нули

Я заметил, что.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") и проанализировать назад прием, работал бы, но ни быстрое ни изящное решение)?

Какие-либо идеи?Большое спасибо.

18
задан Konrad 26 April 2010 в 15:25
поделиться

2 ответа

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

    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;
    }
3
ответ дан 30 November 2019 в 08:21
поделиться

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

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

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

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

7
ответ дан 30 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: