Den sön 28 apr. 2019 kl 19:53 skrev Kaj Persson <kape_...@telia.com> < kape_...@telia.com>:
> Ack nej, någon bugg är det inte. Det har fenomenet har studenter > upptäckt och undrat över ända sedan datorn blev ett användbart verktyg. > Orsaken är att du räknar i det decimala talsystemet, alltså med basen > 10, medan datorn använder det binära talsystemet, basen 2. I datorernas > barndom fanns det faktiskt decimala datorer, men man fann snart att den > konstruktionen tillförde fler problem än den löste, och övergavs snart. > Elektroniken som används är ju binär, man använder element som är > antingen till eller från, vilket vi då tolkar som 1 eller 0. Därför > måste datorn, dig ovetande, varje gång du matar in ett decimalt tal > omvandla det till binär form för att kunna bearbeta det. Om talet är ett > heltal blir representationen lika i de två talsystemen, men med > decimaler skiljer de sig nästan alltid åt i någon avlägsen decimal. > Detta beror på att vi har ett begränsat utrymme att lagra talet, så > någonstans på slutet måste vi kasta bort de överskjutande siffrorna, och > då uppstår alltså ett avrundningsfel. > > Du vet säkert att det binära talsystemet är uppbyggt kring tal med > värdena 1, 2, 4, 8, 16 etc, d.v.s. den efterföljande siffran är alltid > dubbelt så stor som den föregående. Egentligen skulle jag skriva dem i > omvänd ordning för det är så de används enligt positionssystemet. Det > binära talsystemet är uppbyggt analogt med vad gäller i det decimala > talsystemet, där värdet av varje siffra beror på positionen i talet. > T.ex. 123 betyder 1 * 100 + 2 * 10 + 3 * 1. En siffra på en viss > position är värd 10 gånger så mycket som siffran till höger om sig. I > det binära talsystemet arbetar man på samma sätt, men då med värdena 16, > 8, 4, 2, 1 i stället för t.ex. 100, 10, 1, o.s.v. > > När man sedan kommer till decimalerna fungerar det på samma sätt men nu > med positonsvikterna 0,5, 0,25, 0,125, 0,0625 etc, Fortfarande gäller > principen att en siffra på en viss position är värd dubbelt så mycket > som siffran till höger. Här inser man snart att det oftast inte går att > få en exakt koppling mellan det decimala och det binära talsystemet. > Exempelvis motsvaras det decimala talet 0,8 av det binära 1 * 0,5 + 1 * > 0,25 + 0 * 0,125 + 0 * 0,0625 + 1 * 0,03125 etc. D.v.s. binärt > 0,11001... Det fortsätter i all oändlighet, men någonstans säger > konstruktören att nu avsätter vi inte större utrymme för lagringen, och > därmed kastas de resterande decimalerna helt sonika bort. Det är alltså > bara vissa speciella decimaltal, som kan representeras exakt i det > binära talsystemet, såsom exempelvis 0,5, 0,625 etc. > > Lösningen då? Den enklaste är förstås att räkna i ören i stället för > kronor, eller vilken valuta det nu handlar om. Så får man fixa > omvandlingen på slutet genom att helt enkelt dividera slutresultatet med > 100. > En annan utväg är att utnyttja att felet ligger i en decimal långt > utanför hundradelarna, och därför kan man enkelt införa en > avrundningsfunktion där man begränsar antalet visade decimaler till två. > Här finns ett vägval: antingen behåller man datorns beräknade resultat, > men sätter ett format på cellen som begränsar visningen till två > decimaler korrekt avrundat. Eller också kan man införa > avrundningsfunktionen (vars namn jag just nu inte kommer på), =AVRUNDA(<Cellreferens och/eller uttryck>;<Antal decimaler>) Exempelvis: =AVRUNDA(1/3;2) ⇨ 0,33 > där man > förändrar talvärdet till det man önskar. > > Det blev mycket det här, och kanske slår jag in öppna dörrar, ursäkta. > Jag kunde ha gjort det enkelt för mig och bara hänvisat till > hjälptexterna för där framgår de här konsekvenserna, men jag ville lägga > fram det på mitt vis, och då blev det så här. > Tänkte själv skriva ungefär samma sak (fast kanske aningen kortare), men nu slapp jag…! ☺ Vänliga hälsningar Johnny Rosenberg Kaj > > Den 2019-04-28 kl. 11:27, skrev Lars-Göran Hansson: > I vissa lägen räknar calc fel (någon form av öresutjämning som > programmet hittar på själv) i nedanstående kalkyl har jag lagt D15-D16 > och får 3005,0199999999?? > > Cellen D15 innehåller "=+160021,8+2862" > > och cellen D16 innehåller "159878,78" > > Ingen cell innehåller alltså mer än två decimaler > > Är detta någon känd bugg? > > > //Lars-Göran Hansson > > > > > -- > For unsubscribe instructions e-mail to: > users+unsubscr...@sv.libreoffice.org > Problems? > https://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/ > Posting guidelines + more: https://wiki.documentfoundation.org/Netiquette > List archive: https://listarchives.libreoffice.org/sv/users/ > Privacy Policy: https://www.documentfoundation.org/privacy > -- For unsubscribe instructions e-mail to: users+unsubscr...@sv.libreoffice.org Problems? https://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/ Posting guidelines + more: https://wiki.documentfoundation.org/Netiquette List archive: https://listarchives.libreoffice.org/sv/users/ Privacy Policy: https://www.documentfoundation.org/privacy