VB.NET 从 0 到 4 舍入 --> 0 从 5 到 9 --> 1

VB.NET rounding from 0 to 4 -->0 from 5 to 9 --> 1

我们需要按照以下规则应用两次舍入:

如果第三个数字在 0 到 4 之间 --> +0
如果第三个数字在 5 到 9 之间 --> +1

我已经尝试了以下但不是我们需要的

Module VBModule
    Sub Main()
        Console.WriteLine("142.5700 --> " & Math.Round(142.5700,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5710 --> " & Math.Round(142.5710,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5720 --> " & Math.Round(142.5720,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5730 --> " & Math.Round(142.5730,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5740 --> " & Math.Round(142.5740,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5750 --> " & Math.Round(142.5750,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5760 --> " & Math.Round(142.5760,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5770 --> " & Math.Round(142.5770,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5780 --> " & Math.Round(142.5780,2,MidpointRounding.ToEven))
        Console.WriteLine("142.5790 --> " & Math.Round(142.5790,2,MidpointRounding.ToEven))
    End Sub
End Module
142.5700 --> 142.57
142.5710 --> 142.57
142.5720 --> 142.57
142.5730 --> 142.57
142.5740 --> 142.57
142.5750 --> 142.57  this is wrong we need to have 142.58
142.5760 --> 142.58
142.5770 --> 142.58
142.5780 --> 142.58
142.5790 --> 142.58

我尝试修复下面的代码...但我仍然没有得到正确的输出

''' Public 函数 calculateTax (gameId As String, multiplier As String, CSWinning As String) As String CSWinning = CSWinning.Replace(".",",") Dim wins As Decimal = 0 将 firstTax 调暗为十进制 = CDec(0.15) Dim secondTax As Decimal = CDec(0.2)

    If String.IsNullOrEmpty(multiplier) OrElse multiplier.Equals("0") Then
        multiplier = "1"
    End If
    
    Dim winningsMinuscolumns As String = ((CDec(CSWinning) - getColumnCostByGame(gameId)) *CDec(multiplier.Replace("[","").Replace("]",""))).ToString
    
    'Check initially if winning sum is smaller than 100 
    If CDec(winningsMinuscolumns) <= CDec(100) Then
        wins = CDec(CSWinning)
        'Check initially if winning sum is smaller than 500 
    Else If CDec(winningsMinuscolumns) <= CDec(500)
        Dim taxedSum As Decimal = CDec(winningsMinuscolumns) - CDec(100)
        wins = CDec(CDec(CSWinning) - 100) - CDec(taxedSum * firstTax)
        wins = wins + CDec(100)
        'Check initially if winning sum is larger than 500 
    Else
        Dim taxedSum As Decimal = CDec(winningsMinuscolumns) - CDec(500)
        wins = CDec(CDec(CSWinning) - 500) - CDec(taxedSum * secondTax)
        wins = (CDec(400) - (CDec(400) * firstTax)) + wins
        wins = wins + CDec(100)
    End If
    Report.Info("BeforeRound  " & (wins))
    Report.Info("AfterRound  " & roundEven(wins))
    
    Return (roundEven(wins) * CDec(multiplier.Replace("[","").Replace("]",""))).ToString
End Function

    Public Function roundEven(num As Decimal) As Double
    Report.Info("Inside   " & num)
    Report.Info("Inside  cdbl " & CDbl(num))
    Return Math.Round(CDbl(num),2,MidpointRounding.ToEven)
    
End Function

''' 00:14.902 信息用户 BeforeRound 142,5750
00:14.932 内部用户信息 142,5750
00:14.961 信息用户内部 cdbl 142,575
00:14.994 Info User AfterRound 142,57
'''

此代码使用浮点数,这意味着 142.575 由于缩放错误不完全是 142.575。如果你尝试打印超过 13 个小数位的数字,例如:

Console.WriteLine("{0:N14}",142.575)

你会得到

142.57499999999999

不过,如果您使用十进制文字,您将获得预期的结果。下面一行:

Console.WriteLine("{0:N24}",142.575D)

生产

142.575000000000000000000000

Math.Round(142.575D,2,MidpointRounding.ToEven)

生产

142.58

尝试使用Math.round(142.575D,2,MidpointRounting)

输出将为 142.58

尝试使用 .AwayFromZero 而不是 .ToEven。这使用 Double.

    For d As Double = 142.57# To 142.58# Step 0.001#
        Console.WriteLine("{0:n4} --> {1}", d, Math.Round(d, 2, MidpointRounding.AwayFromZero))
    Next

真正的问题是数字代表什么(即金钱或科学计算)?如果这是货币使用十进制。如果科学使用double.

我只是使用原始字符串并将它们格式化为小数点后两位。

Sub Main()
    Dim lst As New List(Of String) From {"142.5700", "142.5710", "142.5720", "142.5730", "142.5740", "142.5750", "142.5760", "142.5770", "142.5780", "142.5790"}
    For Each s In lst
        Console.WriteLine($"{s}--->{CDbl(s):N2}")
    Next
    Console.ReadKey()
End Sub