Gå til innhold

Skoleprosjekt, program som beregner inntekter


Anbefalte innlegg

Videoannonse
Annonse
Round(Number, NumDigitsAfterDecimal)

 

Forresten så er det lurt å bruke Currency når det er snakk om cash (currency er 64 bit, altså kan det inneholde et statsbudsjett eller fjorten)

Av en eller annen syk grunn som jeg ikke forstår så fungerer Round funksjonen helt merkelig.

 

F.eks så gir round(2.565,2) verdien 2.56 , mens det burde vært 2.57. Round(2.555,2) gir korrekt 2.55. Round(2.545,2) gir 2.54 som er feil... osv... osv...

 

Jeg har faktisk vært nødt til å lage (eller rettere sagt, fant den på nettet) en egen avrundingsfunksjon for å få korrekte resultater.

 

Her er den hvis noen ønsker den:

 

Public Function Round( _
ByVal Number As Variant, Optional NumDigits As Long = 0, _
Optional UseBankersRounding As Boolean = False) As Double
'
' ---------------------------------------------------
' From "Visual Basic Language Developer's Handbook"
' by Ken Getz and Mike Gilbert
' Copyright 2000; Sybex, Inc. All rights reserved.
' ---------------------------------------------------
'
 Dim dblPower As Double
 Dim varTemp As Variant
 Dim intSgn As Integer

 If Not IsNumeric(Number) Then
   ' Raise an error indicating that
   ' you've supplied an invalid parameter.
   Err.Raise 5
 End If
 dblPower = 10 ^ NumDigits
 ' Is this a negative number, or not?
 ' intSgn will contain -1, 0, or 1.
 intSgn = Sgn(Number)
 Number = Abs(Number)

 ' Do the major calculation.
 varTemp = CDec(Number) * dblPower + 0.5
 
 ' Now round to nearest even, if necessary.
 If UseBankersRounding Then
   If Int(varTemp) = varTemp Then
     ' You could also use:
     ' varTemp = varTemp + (varTemp Mod 2 = 1)
     ' instead of the next If ...Then statement,
     ' but I hate counting on TRue == -1 in code.
     If varTemp Mod 2 = 1 Then
       varTemp = varTemp - 1
     End If
   End If
 End If
 ' Finish the calculation.
 Round = intSgn * Int(varTemp) / dblPower
End Function

Lenke til kommentar
Den interne funksjonen CInt konverterer til datatypen Integer, mens Val returnerer Double. Begge disse datatypene holder tall, og med mindre du helt klart ikke ønsker høyre tall enn 32768 eller mindre enn -32768, er ikke dette nødvendig. Integer kan, som navnet tilsier, ikke holde annet en heltall.

Må bare pirke litt :whistle:

En integer går faktisk bare opp til 32767,

mens den går helt ned til -32768. :)

Lenke til kommentar
Den interne funksjonen CInt konverterer til datatypen Integer, mens Val returnerer Double. Begge disse datatypene holder tall, og med mindre du helt klart ikke ønsker høyre tall enn 32768 eller mindre enn -32768, er ikke dette nødvendig. Integer kan, som navnet tilsier, ikke holde annet en heltall.

Må bare pirke litt :whistle:

En integer går faktisk bare opp til 32767,

mens den går helt ned til -32768. :)

Er det 16 bits integers i vb nå også? Ikke rart jeg ikke liker det...

Lenke til kommentar
Det korrekte er at 2.5 rundes opp til 3, mens 2.49999999999 rundes ned til 2.

 

Round funskjonen i VB gjør rett i "annenhver" avrunding.  :thumbdown:

Hva mener du med "gjør rett"?

 

Eksempelet ditt er jo korrekt.

Les det første innlegget mitt, eller prøv dette i Immediate Window:

 

? round(2.5)

2

 

? round(3.5)

4

 

 

Ser du ikke feilen?

Lenke til kommentar

Nå kommer sansynligvis mine siste problemer...:

 

1. Jeg skal beregne Lån, annuitets og Serielån... Annuitetslån er pmt... så det er ikke noe problem. Men For Serielån kan jeg ikke noen kommando! Finnes det noen innebygde?

 

2. Problem... Jeg vil gjerne ha en startoppscreen... Den skal være en egen form. Og skal vises i tre sek før det kommer over til den vanlige formen...

 

Hilsen Peter!

Endret av Blackslash
Lenke til kommentar

Jeg vet ikke hvordan du har lyst til å beregne et lån, men dette er jo nesten ikke vb. Bare matte!

 

dim lån, rente 'rente er 20%
lån = 200000
rente = (lån / 100) * 20
msgbox rente

 

Skal du ha load screen kan du bruke en vanlig "Timer" satt på 3000 interval.

Form2.show
unload me

Endret av Jonas
Lenke til kommentar

Slik som programmet er designet nå, kunne du fått alt mer oversiktlig ved å sette de forksjellige trinnene i hvert sin form. Dette er også løsningen mangen andre programmer bruker, og viser seg å være den mest brukervennlige. Eneste ulempen er en litt mer tidskrevene prosess for de mer erfarne.

 

Jeg opplevde også endel problemer med programmet; det klikket, og flere ting fungerte ikke helt skikkelig. Jeg vil anbefale deg å se over koden igjen, eventuelt legge den ut her.

Lenke til kommentar

Oki... fikk utsetetlse og jeg har bare tenkt til å rette en ting til, feilen når man skriver ut.... Her er koden:

 

Når formen loader:

 

DIm baha

 

On error goto baha

form.printform

baha:

svar = msgbox("*Meldingen)

Unload me

End sub

 

Alt står i riktig rekkefølge... men det er nok en del ting som ikke er riktig fordi jeg ikke har det foran meg akkurat nå...

 

Hva er det jeg må gjøre om?'

 

Dersom dere må ha den eksakte koden må dere bare si ifra!

Endret av Blackslash
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...