FormatNumber заменяет число на 0 - PullRequest
       16

FormatNumber заменяет число на 0

0 голосов
/ 08 сентября 2018

Не понимая этого: Номер, возвращаемый из DataReader: 185549633.66000035

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

Например: сохранить 7 мест.

Мы используем:

FormatNumber(dr.Item("Field"), 7, TriState.false, , TriState.True)

Результат: 185 549 633,6600000. Мы хотели бы сохранить 3 (или 35) в конце.

При вычитании двух чисел из полученного запроса мы получаем дельту, но попытка показать эти два числа до 6,7,8 цифр не работает, что указывает на ложную дельту для пользователя.

Любой совет будет оценен.

1 Ответ

0 голосов
/ 08 сентября 2018

На основании моего тестирования вы должны работать со значениями Double, а не Decimal. Не удивительно, что решение вашей проблемы можно найти в документации.

Для начала не следует использовать FormatNumber. Мы больше не в VB6. Чтобы отформатировать номер в VB.NET, наберите ToString для этого номера. Я проверял это:

Dim dbl = 185549633.66000035R
Dim dec = 185549633.66000035D

Dim dblString = dbl.ToString("n7")
Dim decString = dec.ToString("n7")

Console.WriteLine(dblString)
Console.WriteLine(decString)

и я увидел поведение, которое вы описываете, то есть результат был:

185,549,633.6600000
185,549,633.6600004

Я прочитал документацию по методу Double.ToString (обратите внимание, что FormatNumber будет вызывать ToString внутри), и вот что он говорит:

По умолчанию возвращаемое значение содержит только 15 цифр точности, хотя внутренне поддерживается максимум 17 цифр. Если значение этого экземпляра имеет более 15 цифр, ToString возвращает PositiveInfinitySymbol или NegativeInfinitySymbol вместо ожидаемого числа. Если вам требуется большая точность, укажите формат с помощью спецификации формата «G17», которая всегда возвращает 17 цифр точности, или «R», которая возвращает 15 цифр, если число может быть представлено с такой точностью, или 17 цифр, если число может быть только быть представленным с максимальной точностью.

Затем я проверил это:

Dim dbl = 185549633.66000035R

Dim dblString16 = dbl.ToString("G16")
Dim dblString17 = dbl.ToString("G17")

Console.WriteLine(dblString16)
Console.WriteLine(dblString17)

и результат был:

185549633.6600004
185549633.66000035
...