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

Module Module1
Public Sub Main()
 Dim values() As ****** = {43.523, 12.65, 43.565}
 For Each value As ****** 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 вместо ******. В частности, 43.565 не является точно представимым как ****** для начала.

Однако, если вы хотите указать поведение для "средних точек" (то есть, где оно могло бы разумно округлить вверх или вниз), используйте перегрузку с помощью 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)

licensed under cc by-sa 3.0 with attribution.