.NET округление / десятичные различия между веб-серверами - PullRequest
2 голосов
/ 01 июля 2011

У меня есть проблема, которая в настоящее время немного сбивает меня с толку.

Вот немного предыстории: мы находимся в процессе обновления веб-приложения asp.net 2.0 до .net 4 на 64-битном сервере.У нас есть тестовое приложение, развернутое как на новом, так и на старом серверах, чтобы убедиться, что все работает, как и ожидалось, прежде чем мы начнем работу;оба из которых указывают на одну и ту же базу данных на другом сервере.

Вот проблема:

double totalGross;
double totalNet = 9999999.00;
float taxRate = 15.00f;

totalGross = totalNet * (1 + (taxRate / 100));

На старом сервере .ToString () на totalGross создает: 11499998.85

На новом сервере .ToString () на totalGross выдает: 11499998.6115814

В настоящее время затрудняется выяснить, почему это может быть?Последнее значение даже не представляет первое число без округления?

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

Обновление

Я создал консольное приложение и построил его на x86 и x64, запустил обе версии на сервере и вывел две разные цифры.Так что, на самом деле, при использовании double, похоже, что это потеря некоторой точности между 32 и 64 битами.Меня действительно удивляет, что «потеря точности, о которой идет речь, равна 0,2, это не кажется мне таким точным и какая разница ?!Как кто-то предложил, вероятно, лучше использовать десятичный тип (в свою защиту я не писал этот код: P)

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Полагаю, старый сервер был 32-битным? Отметьте http://msdn.microsoft.com/en-us/library/system.double.aspx,, в частности значения Paragrahp с плавающей запятой и Потеря точности. Можете ли вы заставить новый сервер запустить 32-битный процесс, он что-нибудь меняет?

1 голос
/ 01 июля 2011

Как уже упоминали другие, виновата платформа. Однако , я думаю, что использование типа Decimal может быть лучшим выбором и, скорее всего, не будет страдать от той же проблемы, что и Double.(Каждый проект, над которым я работал, связан с финансовой отраслью, для расчета денежных операций используется десятичное число).В документации по десятичным значениям http://msdn.microsoft.com/en-us/library/system.decimal.aspx

нет замечаний о проблемах с плавающей запятой.
0 голосов
/ 01 июля 2011

"Кроме того, результат арифметических операций и операций присваивания со значениями Double может незначительно отличаться в зависимости от платформы из-за потери точности типа Double. Например, результат присваивания литерального значения Double может отличаться в 32- и 64-разрядные версии .NET Framework. " взято из следующего Ссылка

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