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
我们需要按照以下规则应用两次舍入:
如果第三个数字在 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