Странности округления языка XBase

У меня есть требование использовать устаревший код на языке в стиле XBase (в данном случае FoxPro) и преобразовать его в C#.NET. Я хочу получить идентичный результат при перезаписи, но расхождения в округлении сводят меня с ума. Я попробовал Decimal.Round(MidpointRounding) в одиночку, но обнаружил, что мне также нужно написать свою собственную функцию "округления" для ситуаций, когда средняя точка = 5.

Это было бы хорошо, если бы это работало, но я вижу, что мой метод «сводки» необходим для согласования с выводом FoxPro в некоторых случаях, но на самом деле создает расхождения в других. Запрос к базе данных выполняет некоторое умножение и деление, и мне интересно, накапливаются ли математические расхождения между двумя системами.

Вот пример того, что мне кажется несоответствием. Начальное значение каждой пары исходит из вывода моего запроса LINQ. Учитывая это, я хочу сгенерировать округленный результат, идентичный показанному результату FoxPro:

.NET LINQ Query result: 7.0477049103806673503597572093.
FoxPro rounding: 7.0

.NET LINQ: 7.2499596595318807183725770943.
FoxPro rounding: 7.3

Любые предложения относительно того, как я могу точно продублировать значение из устаревшей системы, не прибегая к совершенно бестолковому взлому?


person Buggieboy    schedule 30.11.2012    source источник
comment
Какую версию Foxpro вы используете. Я попробовал ваш результат LINQ в VFP, и он правильно округлен до 7,2 как в качестве переменной (неуказанный явный тип), так и в виде жесткого числа через round (7,2499...., 1) и как строго типизированное десятичное число, установив переменную до 7,2499... -- (полная длина), и все они округлены до 7,2   -  person DRapp    schedule 01.12.2012


Ответы (1)


Ваша проблема может быть связана с точностью с плавающей запятой. Перед запуском программы FoxPro, какого типа переменная хранит значение? А какой тип используете?

Если программа FoxPro использует числа с плавающей запятой с меньшей точностью, чем вы делаете это в C# (или наоборот), это может быть причиной наблюдаемых вами несоответствий.

person driis    schedule 30.11.2012
comment
Пожалуйста, смотрите мой измененный вопрос выше. Я не был полностью откровенен в том, что я не упомянул о выполняемой математике, поэтому я не могу сказать, что входные данные для раунда точно такие же в FoxPro. Отвечая на ваш вопрос, я использую десятичный тип в .NET. В коде FoxPro нет явных объявлений типов. - person Buggieboy; 01.12.2012