Math Методология раунда, начиная с наименьшего десятичного числа

Было много потоков, запущенных из-за путаницы в том, как работает Math.Round . В большинстве случаев на них отвечают путем указания людей на параметр MidpointRounding и того, что большинство людей ожидают MidpointRounding.AwayFromZero . У меня есть еще один вопрос о реальном алгоритме, реализованном AwayFromZero.

Учитывая следующее число (результат ряда вычислений): 13.398749999999999999999999999M

наши пользователи ожидают увидеть тот же результат, что Excel даст им 13.39875 . Поскольку в настоящее время они округляют это число до 4, используя Math.Round (num, 4, MidpointRounding.AwayFromZero), результат будет на 0,0001 меньше ожидаемого. Предположительно, причина этого в том, что алгоритм просто смотрит на пятую цифру (4), а затем округляет соответственно. Если бы вы начали округлять последние 9, реальный математический ответ фактически дал бы вам то же число, что и в Excel.

Итак, вопрос в том ... есть ли способ эмулировать это поведение, а не текущее?

Я написал рекурсивную функцию, которую мы могли бы использовать тем временем. Но прежде чем мы запустили его в производство, я хотел посмотреть, что SO думает о проблеме: -)

    private decimal Round(decimal num, int precision)
    {
        return Round(num, precision, 28);
    }

    private decimal Round(decimal num, int precision, int fullPrecision)
    {
        if (precision >= fullPrecision) return Math.Round(num, precision);

        return Round(Math.Round(num, fullPrecision), precision, --fullPrecision);
    }

Редактировать: просто для ясности, я должен был быть более ясным в своем первоначальном посте. Спрашиваемая здесь методология округления заключается в том, что меня представляют бизнес-аналитики и пользователи, которые сообщают о «ошибке округления». Несмотря на то, что мне неоднократно говорили, что это не неправильно, просто отличается от того, что они ожидают ... этот отчет продолжает поступать. Так что я просто собираюсь ограничиться сбором данных, чтобы собрать как можно больше информации по этой теме, чтобы сообщить о ней обратно пользователи.

В этом случае, похоже, что любая другая система, используемая для генерации этих средних цен (которым мы должны соответствовать), использует другую точность уровня (10 в базе данных, и Excel, кажется, по умолчанию равен 15 или около того) , Grid> Проблема: ...

Моя цель - написать это на XAML:


    

Проблема: Silverlight XAML не может проанализировать DateTime из строки. Поэтому во время выполнения у меня есть исключение XamlParseException «не удается создать DateTime из этой строки».

Когда я использую простой DependencyProperty, я просто добавляю атрибут TypeConverterAttribute в метод получения / установки, и он работает. Вот как это (идея из здесь ):

[TypeConverter(typeof(DateTimeTypeConverter))]
public DateTime MyDate
{
    get { return (DateTime)GetValue(MyDateProperty); }
    set { SetValue(MyDateProperty, value); }
}

Но с подключенным DP DP нет геттера / сеттера. Что я могу сделать, чтобы иметь возможность записать строковую дату в XAML?

Спасибо!

8
задан JYL 27 August 2010 в 13:19
поделиться

1 ответ

Но прикрепленные свойства имеют метод доступа Get. Пробовали ли вы поместить преобразователь типов в метод доступа Get?

Извините за ссылку на конкретную версию, она содержит соответствующую информацию. С этой страницы:

3 . Вы можете атрибутировать TypeConverter на уровне типа для типа, который служит типом значения. Это позволяет преобразовать строки всех значений типа. Дополнительные сведения см. в разделе TypeConverters и XAML.

4 . Вы можете атрибутировать TypeConverter уровня свойства в методе доступа Get. Это позволяет преобразовать строку прикрепленного свойства. Применение TypeConverterAttribute к методу доступа Get, а не к методу доступа Set может показаться неинтуитивным, но именно здесь обработчики XAML ожидают найти информацию о преобразовании типа (если есть) для присоединенного свойства. Дополнительные сведения см. в разделе TypeConverters и XAML.

7
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

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