Convert.ToSingle округления - PullRequest
       5

Convert.ToSingle округления

1 голос
/ 12 февраля 2010

Я сделал запрос к SQL Server, чтобы получить некоторые данные с помощью хранимой процедуры, возвращаемое значение было следующим:

10219150

Затем в сборке (у меня нет исходного кода этогосборка, я отразил файл для просмотра кода) кто-то написал это:

Amount = Convert.ToSingle(10219150); //the value from the stored procedure

Итак, когда я вызываю тот метод, который выполняет окончательное преобразование, он возвращает это значение:

1.021315E+7

Как это возможно?Почему Convert.ToSingle добавляет дополнительные десятичные позиции?Я не понимаю.

Есть ли способ, которым я могу отменить это преобразование в моем коде, когда я вызываю этот метод сборки?Я не могу переписать этот файл сборки, так как он слишком большой, и, как я упоминал ранее, у меня нет исходного кода, чтобы исправить преобразование.

От этого: 1.021315E + 7 К этому: 10219150еще раз (восстановите правильное значение без этого преобразования)

Надеюсь, я все прояснил.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Преобразование в сингл не добавляет дополнительной точности.

10219150 - это 1.021315E + 7 (это просто еще один способ записи 1.021315 * 10 7 ).

Метод, который вы используете для распечатывания значения, заключается в использовании научной нотации для отображения числа.

Если вы печатаете номер, вам необходимо установить параметры форматирования .

    float amount = Convert.ToSingle("10219150");
    string toPrint = string.Format("{0:N}", amount);

Напечатает номер как:

"10,219,150.00"

Чтобы не иметь десятичных разрядов, используйте "{0:N0}" в качестве строки формата.

0 голосов
/ 12 февраля 2010

Когда значение преобразуется в Single, оно округляется, так как содержит более значимые цифры, которые могут поместиться в Single. Если вы конвертируете 10213153 в Single, вы также получите 1.021315E+7, т.е. 10213150.

Поскольку код использует Single для хранения суммы, вы ничего не можете сделать, чтобы он правильно обрабатывал текущее значение. Сумма просто не может быть правильно представлена ​​как Single.

Вы должны использовать более низкие значения или изменить код.

0 голосов
/ 12 февраля 2010

У вас есть две проблемы. Одно легко решаемо, а другое может быть более трудным или невозможным.

Как заявил ChrisF, 1.021315E + 7 - это просто еще один способ написания 10219150. (Часть E + 7 в научной нотации означает смещение десятичной точки на 7 позиций вправо.) можно использовать

fvalue.ToString("f0");

для отображения в виде целого числа, а не в научной нотации.

Большая проблема, к сожалению, состоит в том, что с плавающей запятой одинарной точности можно хранить только 7 значащих цифр, а в вашем примере вы сохраняете 8. Следовательно, последняя цифра может быть округлена. (Поскольку в вашем случае он равен 0, округление, возможно, не было замечено.)

Если потеря точности является критической, вам, вероятно, потребуется извлечь значение из базы данных как длинное или как значение двойной точности (в зависимости от типа возвращаемых данных.) Каждый из этих типов может содержать больше значащие цифры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...