Проблема округления с использованием Math.Round

Module Module1
Public Sub Main()
    Dim values() As Double = {43.523, 12.65, 43.565}
    For Each value As Double In values
        Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2))
    Next
    Console.ReadLine()
End Sub
End Module

Приведенный выше код выглядит как

  • 43,523 -> 43,52

  • 12,65 -> 12,65

  • 43,565 -> 43,56

Мне нужно 43,565 -> 43,57, а не 43,565 -> 43,56. Но мне все еще нужно, чтобы остальные 43,523 -> 43,52 и 12,65 -> 12,65 были округлены как есть.

4 ответа

Решение

Во-первых, если вас интересуют точные десятичные значения, вы должны рассмотреть возможность использования Decimal вместо Double, В частности, 43.565 не совсем представимо как Double начать с.

Однако, если вы хотите указать поведение для "средних точек" (т. Е. Там, где оно может разумно округляться вверх или вниз), используйте перегрузку с MidpointRounding параметр:

Console.WriteLine("{0} --> {1}", value, _
                  Math.Round(value, 2, MidpointRounding.AwayFromZero))

Ты можешь использовать:

Math.Round(value, 2, MidpointRounding.AwayFromZero)

Для получения дополнительной информации см. Перегрузку Math.Round, которая принимает MidpointRounding,

Проверьте параметр MidpointRounding:

Math.Round(43.565, 2, MidpointRounding.AwayFromZero)

Должен дать вам 43,57

Использование

Math.Round(value, 2, System.MidpointRounding.AwayFromZero)
Другие вопросы по тегам