2016-01-16 3 views
2

Здравствуйте я в настоящее время после вычислений с C# и .NET Framework книги, и я с трудом на одном из упражнений, который являетсяРасчет общей суммы изменения заданного

Написать C# программу, внести изменения. Введите стоимость предмета, стоимость которого меньше одного доллара. Вывод монеты, указанные как изменения, с использованием кварталов, копейки, никеля и пенни. Используйте наименьшие монеты . Например, если деталь стоил 17 центов, то изменение будет три четверти, один никель, и три гроши

Поскольку я все еще пытаюсь понять программированию на C# лучший метод, который я придумал это с помощью в то время как цикл.

while(costOfItem >= 0.50) 
      { 
       costOfItem -= 0.50; 
       fiftyPence++; 
      } 

У меня это для каждого из пенсов 20,10,5 и т.д .. Я проверка, если сумма больше или равен 50 пенсов, если да, то я сократить 50 пенсов от суммы заданный пользователем, и добавьте 1 к переменной fiftypence.

затем он перемещается на следующий цикл while, который у меня есть для каждой заготовки. Проблема в том, что где-то вдоль линии одна из циклов отнимает, скажем, 20 пенсов, а costOfItem становится чем-то вроде «0.1999999999999», тогда он никогда не опускается до 0, что должно привести к правильной сумме изменений.

Любая помощь приветствуется, пожалуйста, не предлагайте сложные процедуры, которые я еще рассмотрел.

+0

Какой тип единицы вы используете за предоставленные деньги? – Mindstormer

+0

Какой тип данных вы используете для 'costOfItem'? Похоже на его 'float', если это правда, вы должны попробовать« decimal' вместо этого. – mrtig

+0

Для представления денег вам нужно использовать 'decimal'. Типы с плавающей точкой, такие как 'double' и' float', не подходят и приведут к таким проблемам. См. [Этот связанный вопрос] (http://stackoverflow.com/questions/1165761/decimal-vs-double-which-one-should-i-use-and-when). –

ответ

0

Звуки для меня вы используете float или double, как тип данных для costOfItem.
float и double хранят свои значения в двоичном формате. Но не все десятичные значения имеют точное представление в двоичном формате. Поэтому сохраняется очень близкое приближение . Вот почему вы получаете такие значения, как «0.1999999999999».

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

Вы можете прочитать больше о разнице в Jon Skeets awesome answer к Difference between Decimal, Float and Double in .NET?

0

Если сделать расчет в центах, вы можете использовать целые числа, а затем вы не получаете в с плавающей точкой округления проблемы

+0

это называется представлением Милля и основано на валюте мельницы. Все операции основаны на целых числах. 1000 Mill = 1 доллар. – Ben

0

Спасибо всем для быстрых ответов. Проблема заключалась в том, что я использовал double вместо десятичных знаков предоставленных ссылок есть люди, объясняющие, почему это неправильно делать в некоторых случаях. Использование двойного следует избегать в арифметике, поскольку, по-видимому, некоторые числа с плавающей точкой не имеют точного двоичного представления, поэтому вместо .23 оно дает 0.2299999999999.Изменение переменной на десятичную фиксированную мою проблему

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