преобразовать (длинная мантисса) и (показатель степени sbyte) в десятичную - PullRequest
4 голосов
/ 03 апреля 2012

upd поместил мою версию в конце описания

Мне нужно преобразовать мантиссу и экспоненту в десятичную.Вот как я кодировал:

// long field.Decimal.Mantissa
// sbyte field.Decimal.Exponent
decimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent));

field.Decimal.Mantissa является целым числом, но Math.Pow(10, field.Decimal.Exponent) является двойным, поэтому я боюсь, что могу потерять точность при приведении к десятичному.

Должен ли я написать свойсобственная Pow функция для integer типов, которые будут производить decimal?

Что бы вы предложили?Я забочусь о производительности, так как я вызываю эти функции десятки тысяч раз в секунду!Поэтому уродливые, но быстрые решения очень желательны!

И я забочусь о точности, так как я работаю с деньгами здесь.

Это то, что я только что написал, но, возможно, кто-то может что-то предложитьлучше:

class Util
{
    private static readonly decimal[] posPow10 = {
                                           1M,
                                           10M,
                                           100M,
                                           1000M,
                                           10000M,
                                           100000M,
                                           1000000M,
                                           10000000M,
                                           100000000M,
                                           1000000000M,
                                           10000000000M,
                                           100000000000M
                                       };

    private static readonly decimal[] negPow10 = {
                                           1M,
                                           0.1M,
                                           0.01M,
                                           0.001M,
                                           0.0001M,
                                           0.00001M,
                                           0.000001M,
                                           0.0000001M,
                                           0.00000001M,
                                           0.000000001M,
                                           0.0000000001M,
                                           0.00000000001M,
                                       };


    public static decimal Pow(decimal mantissa, sbyte exponent)
    {
        decimal result = mantissa;
        if (exponent >= 0)
        {
            result *= posPow10[exponent];
        } else {
            result *= negPow10[-exponent];
        }
        return result;
    }
}

1 Ответ

1 голос
/ 03 апреля 2012

Существует конструктор decimal, который делает в значительной степени то, что вы хотите.Но он использует внутреннее представление decimal, которое отличается от вашего представления.Преобразование должно быть довольно простым для чисел с отрицательным exponent, поскольку вы можете напрямую преобразовать это в параметр scale конструктора.Но с положительным значением exponent, я думаю, вам нужно будет выполнить умножение самостоятельно.

Хотя я не знаю, будет ли это на самом деле быстрее, чем ваш код.И это, конечно, будет гораздо менее читабельным, поэтому ваше решение может быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...