2009-10-24 2 views
0

У меня есть функция в C#, который возвращает следующее:округление Ошибка в C#: Различные результаты на разных компьютерах

... 
float amount = smallestPercentage * (float)quantity; 
return (int)amount; 

Теперь я знаю, что я предполагаю использовать Convert.Int32 (количество), а не тип бросало int, и это устранило проблему. Но моя проблема была на самом деле ...

При разработке моей домашней программы (Windows Vista) я получал возвращаемое значение 1, но при развертывании программы в другую среду (Windows XP) я получил бы возвращаемое значение 0.

Мне было интересно, связано ли это с версией Windows, версией .NET или даже процессором процессора?

Спасибо.

Дэвид

+1

64 битной Vista, или 32 бит? –

+0

Каково было значение с плавающей запятой, которое вы округлили? –

+0

какая версия CLR установлена ​​на обеих машинах? –

ответ

2

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

Что касается того, почему это происходит, разные процессоры имеют разные подпрограммы для вычисления поплавков и парных. На вашей целевой машине вы, вероятно, получите значение чуть ниже 1 (скажем, .999987), которое при кастовом превращается в 0. Поплавки были вокруг с момента создания CLR, так что это, скорее всего, проблема с процессором. ОС очень редко вмешивается в прямой код приложения.

8

В самом деле, вы можете получить различные результаты:

  • на разных машинах

  • в зависимости от того, скомпилированы вы отладочных или розничной сборки установок

  • в зависимости от сделали ли вы математика во временных константах компиляции или времени выполнения

  • Как локальные переменные и другие временные значения используются в вашем методе

  • и так далее.

C# Спецификация предусматривает, что арифметика с плавающей может быть сделано в выше точности, чем вы ожидаете. Никогда не было точности, чем вы ожидали, но мы оставляем за собой право использовать алгоритмы более высокой точности на определенном оборудовании и с некоторыми доступными оптимизациями, в любое время, когда дрожание думает, что это может сойти с рук. Это означает, что в операциях, которые очень чувствительны к небольшим изменениям в точности, как округление, могут давать совершенно разные результаты, казалось бы, без объяснения причин.

Вы не первый пользователь переполнения стека, чтобы обнаружить этот факт: Problem converting from int to float

Смежные вопросы