/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
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
> > >
> > >
> >
> >
>
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste