2010-03-27 2 views
2

Сегодня у меня возникла странная проблема на C#. У меня есть страница ASP.NET, где пользователь может ввести определенную цену, количество и т. Д. Я получаю значение цены, конвертирую его в double, а затем умножаю его на 100, а затем выводим его в целое число. Когда цена равна «33,30», после преобразования ее в double она остается 33,3 (очевидно ...), но после ее умножения на 100 она становится 3329.9999999999995, и когда я отбрасываю ее на целое число, применяя простой оператор-оператор «(int) (цена * 100) ", становится 3329.C#: Ошибка преобразования числа

Прямо сейчас я понятия не имею, почему это происходит. Поэтому я думал, что вы, ребята, можете помочь :).

ответ

10

Это происходит из-за способа doubles are stored. Вы должны использовать decimal при работе с деньгами, чтобы избежать ошибок округления.

+1

+1 Точно :-) – Steffen

2

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

Что вы делаете по умолчанию: flooring - это именно то, что вы наблюдаете. (и согласуется с C)

+0

Но я хочу знать, почему умножение 33.3 с 100 производит 3329.9999999999995. Есть идеи ? И о проблеме я уже решил ее использовать методы класса «Конвертировать» :) –

5

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

Чтобы преодолеть это, вы должны округлить до ближайшего целого числа - этого лучше всего достичь с помощью Math.Round.

При работе с валютами, однако, рекомендуется использовать тип decimal вместо double.

8

не бросайте его, округлите его, используя Math.Round. и его лучше использовать decimal типа для валюты

2

Ошибка в том, что двойники хранятся в двоичном виде. Хотя каждая двоичная дробь имеет точное десятичное разложение, большинство десятичных знаков не имеют точного двоичного расширения. Десятичное число 33.3 имеет неточное двоичное разложение. Затем это приближение умножается на 100 и преобразуется в его точное десятичное расширение, которое составляет 3329.9999999999995. (На самом деле, это не может быть точное расширение из-за усечения отображения, но суть в нем такая же.)

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