Gå til innhold

C#: Problem med regneoperasjon på double med verdi under 1


Anbefalte innlegg

Hei. Rimelig fersk C# programerer her.

 

Sitter og jobber med en skoleoppgave og har kommet over et merkelig problem jeg ikke helt klarer å løse av meg selv eller har god nok fortsåelse av C# til å forstå.

 

Jeg har laget en meget enkel cmd applikasjon som simulerer en "vending machine" (engelsk land, skole og språk så husker ikke det norske ordet her og nå).

Du kan velge mellom tre forskjellige størrelser på drikken din med satte priser i forhold til størrelse. Prisen er satt med double variabler og er henholdsvis 1.5, 2.6 og 3.4.

Du kan legge på penger i forskjellige kvanta og deretter få ut drikken din.

Problemet kommer når man velger en stor drikke (pris = 3.4). Om man legger på et beløp som er høyere en prisen fungerer det fint (også alt under generer riktige feilmeldinger), men om man legger på nøyaktig antall mynter begynner det å bli rart.

 

Jeg har funnet ut at feilen oppstår idet man legger på noe som setter verdien av differansen mellom mynter inn og totalpris til under 1.

 

Jeg legger ved noen screenshots som forklarer problemet samt hele kildekoden (dette er som sagt mitt første program så koden er neppe pen eller veldig optimal (konstruktiv kritikk mottas med takk, jeg vil gjerne lære)).

 

Screenshot 1:

Her har jeg valgt en stor drikke og legger på mynter i kvanta av 0.1 for å vise poenget mitt. Se hva som skjer idet verdien går under 1.

post-40306-0-44347500-1302192515_thumb.png

 

Screenshot 2:

Her har jeg valgt en medium drikke (pris = 2.6) og gjort det samme som i screenshot 1, dette fungerer.

post-40306-0-88208400-1302192527_thumb.png

 

Screenshot 3:

Her har jeg endret prisen fra 3.4 til 3.1 og prøvd det samme igjen, dette fungerer.

post-40306-0-25836300-1302192541_thumb.png

 

Jeg har ingen ide hvorfor dette skjer og håper noen her kan hjelpe meg med å løse dette, har en følelse av at det er noe veldig enkelt jeg muligens har oversett.

 

Som sagt, kommentarer til koden mottas med glede.

 

Legger også ved hele kildekoden til programmet her så kan dere teste det selv:

AVM.cs.zip

Lenke til kommentar
Videoannonse
Annonse

Det har med nøyaktigheten av desimaltall. Diosse er ikke 100% nøyaktige i en datamaskin og du opplever avrundingsproblematikk.

 

Enten må du håndtere avrundig korrekt (avrunde oppover?) elelr gjøre innput om til heltall før videre håndtering (det vil si at 1.2 er 12 eller 120).

Lenke til kommentar

Du må ikke sammenligne flyttall med == operasjonen.

 

Istedet burde du skrive en funksjon som sammenligner med en viss toleranse:

 

public static class Extensions
{
 public static bool Equals(double a, double b, double delta = 0.001)
 {
   return (a >= b - delta) && (a <= b + delta);
 }
}

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...