【问题标题】:Money change VBA换钱VBA
【发布时间】:2021-03-29 19:54:59
【问题描述】:

我赚了一小笔代码更改钱,但我有一个小问题

代码是这样的

Dim moneyHelper As Double
moneyHelper = 1.9

While moneyHelper > 0
  If moneyHelper > 25 Then
  Else If moneyHelper > 10 Then
  Else If moneyHelper > 5 Then
  Else If moneyHelper > 1 Then
    console.WriteLine("change $1 x " + Math.Floor(moneyHelper/1).ToString)
    moneyHelper = moneyHelper - (Math.Floor(moneyHelper/1)*1)
    console.WriteLine("result after $1: " + moneyHelper.ToString)
  Else If moneyHelper > 0.5 Then
    console.WriteLine("change $0.5 x " +  Math.Floor(moneyHelper/0.5).ToString)
    moneyHelper = moneyHelper - ( Math.Floor(moneyHelper/0.5)*0.5)
    console.WriteLine("result after $0.5: " + moneyHelper.ToString)
  Else If moneyHelper > 0.1 Then
    console.WriteLine("change $0.1 x " +  Math.Floor(moneyHelper/0.1).ToString)
    moneyHelper = moneyHelper - ( Math.Floor(moneyHelper/0.1)*0.1)
    console.WriteLine("result after $0.1: " + moneyHelper.ToString)
  End If
End While

但是结果是这样的

change $1 x 1
result after $1: 0.9
change $0.5 x 1
result after $0.5: 0.4
change $0.1 x 3
result after $0.1: 0.0999999999999999

更改后,结果应为 0 和更改 $0.1x4,但改为 0.0999999999999999 和更改 $0.1x3。我不知道为什么。

如果你们能提供任何帮助,我将不胜感激!谢谢你

【问题讨论】:

  • 我记得在某处读到 Double 类型遇到舍入错误。改为使用Decimal,你应该没问题。谷歌指出了几个涵盖这个问题的链接 - google.co.uk/search?q=.net+double+rounding+errors
  • 我试图转换十进制但我有同样的问题console.WriteLine("change $1 x " + (Math.Floor(moneyHelper/1.0)*1.0).ToString)
  • 1.0 是 Double,您可能希望 1.0D 确保在不进行任何转换的情况下使用小数完成数学运算。
  • 向@JayV 发表评论,也尝试搜索“每个计算机科学家都应该了解的浮点知识”。我还建议阅读 Bruce Dawson 关于浮点格式的博客系列。

标签: vb.net uipath


【解决方案1】:

试试这个:

    Dim moneyHelper As Decimal = 1.9D
    While moneyHelper > 0
        Select Case moneyHelper
            Case > 25D
               '?
            Case > 5D
               '?
            Case > 1D
                Console.WriteLine($"change $1 x {Math.Floor(moneyHelper / 1)}")
                moneyHelper -= CDec(Math.Floor(moneyHelper / 1) * 1)
                Console.WriteLine($"result after $1: {moneyHelper}")
            Case > 0.5D
                Console.WriteLine($"change $0.5 x {Math.Floor(moneyHelper / 0.5)}")
                moneyHelper -= CDec(Math.Floor(moneyHelper / 0.5) * 0.5)
                Console.WriteLine($"result after $0.5: {moneyHelper}")
            Case > 0.1D
                Console.WriteLine($"change $0.1 x {Math.Floor(moneyHelper / 0.1)}")
                moneyHelper -= CDec(Math.Floor(moneyHelper / 0.1) * 0.1)
                Console.WriteLine($"result after $0.1: {moneyHelper}")
            'Case Default?
               '?
        End Select
    End While

您可以通过用参数化函数替换重复的代码来加强这一点,但这不是您的问题。此外,按原样代码不会处理 moneyHelper 的所有值,例如值 Case Default。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2018-01-29
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多