Allgemeines Runden Problem

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Allgemeines Runden Problem

    Hallo ihr Lieben ;),
    ich arbeite zurzeit an einem Wirtschaftlichen Programm, bzw. einem Programm für meinen Unterricht ;)
    Dort muss ich Zahlen runden.

    Im Zahlenbereich von 1- 1.000 ~ in 50er Einheiten : 750,800,850

    VB.NET-Quellcode

    1. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    2. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 50) * 50)
    3. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    4. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 50) * 50)


    Klappt =>

    Im Zahlenbereich von 1.000- 10.000 in 100er Einheiten : 5500, 5600,9800

    VB.NET-Quellcode

    1. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    2. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 100) * 100)
    3. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    4. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 100) * 100)


    Klappt auch => nun aber

    Im Zahlen bereich von 10.000- 50.000 => 250er Einheiten : 17250, 17500 , 17750

    VB.NET-Quellcode

    1. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    2. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 250) * 250)
    3. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    4. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 250) * 250)


    Er rundet mir hier auf 100er Schritte

    Das gleiche bei 50.000 - 100.000 => 500er Einheiten : 85000, 86000, 865000

    VB.NET-Quellcode

    1. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    2. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 500) * 500)
    3. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    4. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 500) * 500)





    Edit: Habe die Dateien angehängt.
    Habe immer den Hinteren Wert geändert, auf das was gerundet werden soll, nur bei den letzten beiden wird in 100er gerundet. Was kann ich tun ?


    Hier der TestCode:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim isn As Integer = 0
    4. Do Until isn = -1
    5. Console.WriteLine("Eingeben")
    6. rechnen(Console.ReadLine)
    7. Loop
    8. End Sub
    9. Dim trading_buy_p As Integer = 85
    10. Dim trading_sell_P As Integer = 95
    11. Sub rechnen(ByVal avp_price)
    12. Dim ek_preis As Integer = 0
    13. Dim vk_preis As Integer = 0
    14. Dim avp_preis As Integer = CInt(avp_price)
    15. ' 1.000
    16. If avp_preis < 1000 Then
    17. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    18. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 50) * 50)
    19. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    20. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 50) * 50)
    21. If ek_preis = vk_preis Then
    22. ek_preis = ek_preis - 50
    23. End If
    24. ek_preis = ek_preis - 100
    25. ' 10.000
    26. ElseIf vk_preis < 10000 Then
    27. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    28. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 100) * 100)
    29. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    30. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 100) * 100)
    31. If ek_preis = vk_preis Then
    32. ek_preis = ek_preis - 500
    33. End If
    34. If vk_preis - 100 <= ek_preis Then
    35. ek_preis = ek_preis - 200
    36. End If
    37. '50.000
    38. ElseIf vk_preis < 50000 Then
    39. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    40. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 250) * 250)
    41. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    42. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 250) * 250)
    43. If ek_preis = vk_preis Then
    44. ek_preis = ek_preis - 2500
    45. End If
    46. '100000
    47. ElseIf vk_preis < 100000 Then
    48. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    49. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 500) * 500)
    50. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    51. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 500) * 500)
    52. If ek_preis = vk_preis Then
    53. ek_preis = ek_preis - 5500
    54. End If
    55. ElseIf vk_preis < 1000000 Then
    56. Dim ekp_ungerunded As Integer = CInt(avp_preis / 100 * trading_buy_P)
    57. ek_preis = Convert.ToInt32(Math.Round(ekp_ungerunded / 1000) * 1000)
    58. Dim vkp_ungerunded As Integer = CInt(avp_preis / 100 * trading_sell_P)
    59. vk_preis = Convert.ToInt32(Math.Round(vkp_ungerunded / 1000) * 1000)
    60. If ek_preis = vk_preis Then
    61. ek_preis = ek_preis - 5500
    62. End If
    63. End If
    64. Console.WriteLine("DSP=" & avp_preis & " EK/VP:" & ek_preis & "/" & vk_preis)
    65. End Sub
    66. End Module
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Redjo“ ()

    Ich bin einfach Schritt für Schritt von Anfang an durchgegangen (bei 17700 Anfangswert) und habe gesehen, dass das Programm bei <10.000 reinspringt, da habe ich es erst gemerkt. :)

    Und schreibe bitte den Datentyp in "ByVal avp_price As.." rein, die Konvertierung kannst du ja beim Aufruf schon machen.
    hier - probiert das hier auch mal:

    VB.NET-Quellcode

    1. Private Function GetSnapValue(ByVal Number As Double) As Double
    2. 'look up in the number-sequence {... 0.1, 0.2, 0.5, 1, 2, 5, 10, ...} for the Value most close to Number
    3. Dim DecimalRangeBottom As Double = 10 ^ Int(Math.Log10(Number))
    4. Dim upper As Double
    5. Dim lower As Double = DecimalRangeBottom
    6. 'tests 2-fold, 5-fold, 10-fold
    7. For Each Factor As Double In New Double() {2, 5, 10}
    8. upper = Factor * DecimalRangeBottom
    9. If upper >= Number Then Exit For
    10. lower = upper
    11. Next
    12. Return If(upper - Number < Number - lower, upper, lower) 'den mittm kleineren Abstand returnen
    13. End Function
    Ne, der Code berücksichtigt die Anforderungen des TE nicht wirklich, egal, welchen Faktor man nimmt ;) Bei 2.5 würde man bei 17700 sofort auf 25000 springen, weil DecimalRangeBottom 10.000 ist. Man braucht aber unterschiedliche Abstände je nach Bereich und von 10.000 bis 50.000 eben 250.