На основании моего тестирования вы должны работать со значениями 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