|
| forskellig afrunding Fra : Jan Hansen |
Dato : 05-04-01 12:01 |
|
hvordan klarer man at skulle afrunde forskelligt alt efter talletstørrelse?
Jeg har nogle positive tal med 1 decimal hvor resultatet skal vises som
følgende:
mellem 0 - 10 afrundes til nærmeste 0,1 (nemt nok
mellem 10 - 20 afrundes til nærmeste 0,5
større end 20 afrundes til nærmeste 1,0
Mvh Jan Hansen
| |
Bjørnar Nilsen (05-04-2001)
| Kommentar Fra : Bjørnar Nilsen |
Dato : 05-04-01 12:40 |
|
Forsøk dette:
Dim dMidl As Double
dMidl = InputBox("Tall")
Select Case dMidl
Case Is <= 10
dMidl = Int(FormatNumber((dMidl / 0.1), 0)) * 0.1
Case Is <= 20
dMidl = Int(FormatNumber((dMidl / 0.5), 0)) * 0.5
Case Is > 20
dMidl = FormatNumber(dMidl, 0)
End Select
MsgBox dMidl
mvh
Bjørnar Nilsen
"Jan Hansen" <jh@fa.dk> skrev i melding
news:kfYy6.73$IB4.12833@news.get2net.dk...
> hvordan klarer man at skulle afrunde forskelligt alt efter
talletstørrelse?
>
> Jeg har nogle positive tal med 1 decimal hvor resultatet skal vises som
> følgende:
>
> mellem 0 - 10 afrundes til nærmeste 0,1 (nemt nok
> mellem 10 - 20 afrundes til nærmeste 0,5
> større end 20 afrundes til nærmeste 1,0
>
> Mvh Jan Hansen
>
>
| |
Tomas Christiansen (05-04-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 05-04-01 13:03 |
|
Bjørnar Nilsen skrev:
> dMidl = Int(FormatNumber((dMidl / 0.1), 0)) * 0.1
Af rent nysgerrighed: Hvad er formålet med at bruge Int() på resultatet af
FormatNumber()?
-------
Tomas
| |
Bjørnar Nilsen (05-04-2001)
| Kommentar Fra : Bjørnar Nilsen |
Dato : 05-04-01 13:33 |
|
Har kun med hvilken "verditype" man ønsker å regne videre på i funksjonen.
F.eks. vil FormatNumber((12,34 / 0.5), 0) * 0.5 være "12,5" mens
Int(FormatNumber((dMidl / 0.5), 0)) * 0.5 vil være 12,5 (uten apostrof).
Vet ikke om det har noen betydning - sannsynligvis(sikkert) ikke i dette
tilfellet - så i såfall kan man sikkert utelate Int(). I alle fall skulle
man vel ha brukt CDbl()...
Fant imidlertid også en annen "feil"; hvis man ønsker at rutinen skal virke
på samme måte for negative tall, må det testest på absoluttverdien til dMidl
i select case-setningen (se ny kodesekvens).
Dim dMidl As Double
dMidl = InputBox("Tall")
Select Case Abs(dMidl)
Case Is <= 10
dMidl = Int(FormatNumber((dMidl / 0.1), 0)) * 0.1
Case Is <= 20
dMidl = Int(FormatNumber((dMidl / 0.5), 0)) * 0.5
Case Is >= 20
dMidl = Int(FormatNumber(dMidl, 0)) 'Lagt til for å være konsekvent
End Select
MsgBox dMidl
"Tomas Christiansen" <toc@blikroer.dk.removethis> skrev i melding
news:T9Zy6.87$IB4.13482@news.get2net.dk...
> Bjørnar Nilsen skrev:
> > dMidl = Int(FormatNumber((dMidl / 0.1), 0)) * 0.1
>
> Af rent nysgerrighed: Hvad er formålet med at bruge Int() på resultatet af
> FormatNumber()?
>
> -------
> Tomas
>
>
| |
Tomas Christiansen (05-04-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 05-04-01 20:12 |
|
Bjørnar Nilsen skrev:
> F.eks. vil FormatNumber((12,34 / 0.5), 0) * 0.5 være "12,5" mens
> Int(FormatNumber((dMidl / 0.5), 0)) * 0.5 vil være 12,5 (uten apostrof).
Det er ganske enkelt ikke korrekt!
Resultatet af FormatNumber vil altid være af typen String.
Dette er naturligvis ikke ønskværdigt, når du bagefter vil gange med 0.5,
men VB finder selv ud af at den er gal, og konverterer straks denne streng
til en Double inden der ganges.
Man skulle så tror at, bruger man Int() på resultatet af FormatNumber, får
man konverteret til en Integer, MEN DET GØR MAN IKKE!!! Af én eller anden
finurlig grund er resultatet af Int("123") af typen Double!!!
Hvis man ønsker at foretage en eksplicit konvertering af FormatNumber's
resultat (altid en god idé for at vise hvad det er man ønsker at gøre, og
det bliver nødvendigt at gøre den slags i VB.NET), kan man bruge CInt, CLng,
CSng, CDbl, ...
En anden ting jeg studsede over var, at du sætter en parentes omkring
udtrykket (dMidl / 0.5), hvilket jo er ganske unødvendigt. Det gør dog ingen
skade her.
Hvis man vil se hvilken type en variabel eller en udtryk har, kan man bruge
TypeName() - og man kan nogle gange blive forbavset over resultatet:
Debug.Print TypeName(FormatNumber(1.2, 0))
Debug.Print TypeName(Int(123)
Debug.Print TypeName(Int("123")
-------
Tomas
| |
Bjørnar Nilsen (06-04-2001)
| Kommentar Fra : Bjørnar Nilsen |
Dato : 06-04-01 07:55 |
|
Tomas Cristiansen skrev
> Det er ganske enkelt ikke korrekt!
> Resultatet af FormatNumber vil altid være af typen String.
> Dette er naturligvis ikke ønskværdigt, når du bagefter vil gange med 0.5,
> men VB finder selv ud af at den er gal, og konverterer straks denne streng
> til en Double inden der ganges.
Jeg er klar over at VB vil konvertere verdien før den brukes videre, men jeg
påpeker
bare en viss form for forutinntatthet når jeg explicit formaterer verdien. I
tråd med "god
programmeringsskikk" bør man gjøre dette - det blir også færre mulige "bugs"
i programmene.
At VB.NET også krever dette, styrker bare argumentet for "manuell"
konvertering.
> Man skulle så tror at, bruger man Int() på resultatet af FormatNumber, får
> man konverteret til en Integer, MEN DET GØR MAN IKKE!!! Af én eller anden
> finurlig grund er resultatet af Int("123") af typen Double!!!
Det viste jeg ikke - merkelig.
> Hvis man ønsker at foretage en eksplicit konvertering af FormatNumber's
> resultat (altid en god idé for at vise hvad det er man ønsker at gøre, og
> det bliver nødvendigt at gøre den slags i VB.NET), kan man bruge CInt,
CLng,
> CSng, CDbl, ...
Nettopp...
> En anden ting jeg studsede over var, at du sætter en parentes omkring
> udtrykket (dMidl / 0.5), hvilket jo er ganske unødvendigt. Det gør dog
ingen
> skade her.
Lærern min sa alltid "Et parantes for mye er bedre enn et parates for
lite".... :)
mvh
Bjørnar Nilsen
| |
Tomas Christiansen (06-04-2001)
| Kommentar Fra : Tomas Christiansen |
Dato : 06-04-01 22:38 |
|
Bjørnar Nilsen skrev:
> jeg påpeker bare en viss form for forutinntatthet når jeg explicit
formaterer
> verdien. I tråd med "god programmeringsskikk" bør man gjøre dette
Helt enig! Med tryk på de sidste fire ord i din sætning.
> Lærern min sa alltid "Et parantes for mye er bedre enn et parates for
> lite".... :)
Ja, når bare man ved hvad man gør!
-------
Tomas
| |
N/A (05-04-2001)
| Kommentar Fra : N/A |
Dato : 05-04-01 13:59 |
|
| |
Bjørnar Nilsen (05-04-2001)
| Kommentar Fra : Bjørnar Nilsen |
Dato : 05-04-01 13:59 |
|
Erstatt:
MsgBox dMidl
Med:
MsgBox Format(dMidl, ".0")
mvh
Bjørnar Nilsen
"Jan Hansen" <jh@fa.dk> skrev i melding
news:BGZy6.97$IB4.13431@news.get2net.dk...
> Takker.
>
> Det virker med den ene fejl at jeg ikke får decimal tegn med på case 2 og
3?
>
> case 2 skal vise 0 eller 5 som decimal
> og case 3 skal vise 0 som decimal
>
> Mvh Jan Hansen
>
>
> Bjørnar Nilsen <bni@start.no> skrev i en
> nyhedsmeddelelse:sRYy6.5898$NR.511112@news3.oke.nextra.no...
> > Forsøk dette:
> >
> > Dim dMidl As Double
> > dMidl = InputBox("Tall")
> >
> > Select Case dMidl
> > Case Is <= 10
> > dMidl = Int(FormatNumber((dMidl / 0.1), 0)) * 0.1
> > Case Is <= 20
> > dMidl = Int(FormatNumber((dMidl / 0.5), 0)) * 0.5
> > Case Is > 20
> > dMidl = FormatNumber(dMidl, 0)
> > End Select
> > MsgBox dMidl
> >
> > mvh
> > Bjørnar Nilsen
> >
> > "Jan Hansen" <jh@fa.dk> skrev i melding
> > news:kfYy6.73$IB4.12833@news.get2net.dk...
> > > hvordan klarer man at skulle afrunde forskelligt alt efter
> > talletstørrelse?
> > >
> > > Jeg har nogle positive tal med 1 decimal hvor resultatet skal vises
som
> > > følgende:
> > >
> > > mellem 0 - 10 afrundes til nærmeste 0,1 (nemt nok
> > > mellem 10 - 20 afrundes til nærmeste 0,5
> > > større end 20 afrundes til nærmeste 1,0
> > >
> > > Mvh Jan Hansen
> > >
> > >
> >
> >
>
>
| |
|
|