#c# #floating-point
#c# #с плавающей запятой
Вопрос:
У меня есть приложение, которое управляет стоимостью проекта от миллиона до миллиардов долларов. Первоначально пользователи вводят оценку проекта: называется «сумма ассигнований».
Проблема заключается в:
Исходное значение преобразуется не так, как ожидалось. Некоторые примеры включают:
Они вводят
: 111 222 333, которые преобразуются в: 111 222 336
Они вводят: 111,222,333,444
Он преобразуется в: 111,222,333,440
Проблема возникает здесь:
Проблема возникает при преобразовании в следующей строке кода…
project.AppropriationAmount = (!String.IsNullOrEmpty(txtAppropriationDollars.Text)) ? Convert.ToSingle(txtAppropriationDollars.Text) : 0;
Примечания:
project.AppropriationAmount
является float
.
Спасибо за помощь!
Комментарии:
1. Есть вакансии? Я вижу возможность.
2. Я сомневаюсь, что это проблема… но почему вы используете Convert? Просто используйте
Single.Parse()
илиSingle.TryParse()
. Вы не хотите преобразовывать значение, вы просто хотите его проанализировать.3. ‘Одиночный. TryParse()’ приводит к значению научной записи
Ответ №1:
Вы должны использовать decimal
вместо float
за деньги.
Из MSDN:
Ключевое слово decimal указывает 128-битный тип данных. По сравнению с типами с плавающей запятой десятичный тип имеет большую точность и меньший диапазон, что делает его подходящим для финансовых и денежных расчетов.
Использование Convert.ToDecimal(..)
и присвоение decimal
переменной дали ожидаемые (правильные) результаты для ваших примеров.
Комментарии:
1. Я думаю, возникает вопрос: подходит ли десятичное число для очень больших чисел, таких как: 111,222,333,444?
2. @PrisonerZERO: Абсолютно. Десятичное число обрабатывает до 28 цифр.