haqbar Skrevet 7. april 2011 Del Skrevet 7. april 2011 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. Screenshot 2: Her har jeg valgt en medium drikke (pris = 2.6) og gjort det samme som i screenshot 1, dette fungerer. Screenshot 3: Her har jeg endret prisen fra 3.4 til 3.1 og prøvd det samme igjen, dette fungerer. 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
PerB Skrevet 7. april 2011 Del Skrevet 7. april 2011 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
GeirGrusom Skrevet 8. april 2011 Del Skrevet 8. april 2011 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå