Преобразование больших значений в долларах в C#

#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 цифр.