En användare på Stack Overflow gav som ett skäl att inte använda flyttal för pengar, att "om man adderar ett öre hundra gånger är det inte säkert att man får en krona", men jag tror inte att det stämmer. Om flyttalstypen har en precision som lagrar 0.01 med t.ex. 1/2000 promilles felmarginal, kommer väl resultatet 1.00 (kronan) att ha 1/20 promilles felmarginal, och den marginalen får man även med konstanten 1 eftersom 1.00 har hundra gånger mer signifikans i siffror att lagra än 0.01?
Problemet med flyttal är väl bara den binära lagringen, inte operationen för den antar jag ger ett resultat som är exakt ända ner till hälften av den lägsta biten i mantissan. Ören lagrade som heltal blir mer inexakt än det om man använder division. Dela 100:- på tre arvtagare så får varje person bara 33,33:-. Så länge man inte jämför två flyttal med == eller andra relationsoperatorer, utan använder t.ex. `fabs(x - y) < 0.01`, och skriver ut endast två decimaler med `printf("%.2f", z)`, så borde flyttal vara bättre?
Affärer avrundar varje köp till en jämn krona. Om något kostar 9,90:- får jag inte tillbaka den där 10-öringen vid nästa köp. Det vore intressant att veta om bankerna gör likadant. Om man får en ränta på 123,456, som avrundas upp till 123,46, kommer man att få 123,45 nästa gång? Lagras saldot avrundat till exakta ören eller med maximal precision?
Kan inte avrundning till ören bli ett säkerhetshål? Om ICA även köpte produkter, skulle jag kunna gå in och köpa lagom antal sexpack folköl för 18,90:- styck så att avrundningen blev till min fördel, och sen sälja dem ett och ett för 19:-. Kan man göra något liknande med banktransaktioner om varje transaktion är gratis och går fort?
Problemet med flyttal är väl bara den binära lagringen, inte operationen för den antar jag ger ett resultat som är exakt ända ner till hälften av den lägsta biten i mantissan. Ören lagrade som heltal blir mer inexakt än det om man använder division. Dela 100:- på tre arvtagare så får varje person bara 33,33:-. Så länge man inte jämför två flyttal med == eller andra relationsoperatorer, utan använder t.ex. `fabs(x - y) < 0.01`, och skriver ut endast två decimaler med `printf("%.2f", z)`, så borde flyttal vara bättre?
Affärer avrundar varje köp till en jämn krona. Om något kostar 9,90:- får jag inte tillbaka den där 10-öringen vid nästa köp. Det vore intressant att veta om bankerna gör likadant. Om man får en ränta på 123,456, som avrundas upp till 123,46, kommer man att få 123,45 nästa gång? Lagras saldot avrundat till exakta ören eller med maximal precision?
Kan inte avrundning till ören bli ett säkerhetshål? Om ICA även köpte produkter, skulle jag kunna gå in och köpa lagom antal sexpack folköl för 18,90:- styck så att avrundningen blev till min fördel, och sen sälja dem ett och ett för 19:-. Kan man göra något liknande med banktransaktioner om varje transaktion är gratis och går fort?