Pankeissa tämä on oikea ongelma. Siellä ei tehdä "Kyllä niitä senttejä kaikki muutkin kirjaavat pois" vaikka kuinka tekisi mieli.
Itseasiassa pankkimaailmassa se taitaa johtua liukulukujen tarkkuudesta tjsp
Haaste: Koodaa pyöristysalgoritmi
Xcode, Mac OS X Server sekä muuta hauskaa ja hyödyllistä
-
- Viestit: 131
- Liittynyt: 24.5.2012 klo 10.29
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja jra72 »
Viimeksi muokannut jra72, 3.1.2014 klo 19.35. Yhteensä muokattu 1 kertaa.
-
- Viestit: 18040
- Liittynyt: 20.2.2004 klo 23.12
- Paikkakunta: Tampere
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja Jamac »
Tuyo verohallinnon ohje perustuu vain ja ainoastaanb siihen, että tietokoneet kautta linjan laskevat nuo pyöristykset väärin, ja ilman tuota ohjetta ongelmia tulee liikaa. Se on niin.
Alihankintana printtipuolen graafista materiaalia!
-
- Viestit: 5366
- Liittynyt: 21.2.2004 klo 11.46
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja pallo »
Excel laskee tishmalleen oikein, jos luvut on syötetty oikein. Teshtasin esimerkilläsi, muokkasin solut jälkikäteen 2-desimaaliin ja alkuperäiset syötetyt tiedot olivat monidesimaalisia esimerkistäsi.
Viimeksi muokannut pallo, 3.1.2014 klo 19.41. Yhteensä muokattu 1 kertaa.
-
- Viestit: 255
- Liittynyt: 20.10.2012 klo 22.48
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja hesebe »
Excel:ssä on rajoitettu tarkkuus, olikohan 16 numeroa.pallo kirjoitti:Excel laskee tishmalleen oikein, jos luvut on syötetty oikein. Teshtasin esimerkilläsi, muokkasin solut jälkikäteen 2-desimaaliin ja alkuperäiset syötetyt tiedot olivat monidesimaalisia esimerkistäsi.
Ongelma ei ole pyöyristyksen laskennassa, vaan siinä mihin pyöristysvirheet, (erot, jotka eivät ole virheellisesti laskettu) kirjataan.
Jaa yksi euro kolmeen osaan niin saat 3*33 senttiä, yksi sentti jää yli, mihin noista kirjaat eron, vai ihan omalle tlilille.
Penninpyöristyksillä miljonääriksi?
-
- Viestit: 5240
- Liittynyt: 27.4.2006 klo 18.46
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja Thoth »
Jamac kirjoitti:Laskussahan ongelma esiintyy niin, että laskulle pitää kirjoittaa laskurivien yhteensä sarakkeen summa kahdella desimaalilla. Tämä on ns. veroton nettohinta. Tässä vaiheessa on siis pakko pyöristää kahteen desimaaliin
100,4445
100,0115
------------
200,46
Ylläoleva on allekkain laskettuna yksiselitteisesti oikein, eikö?
Tulostetaanpa tämä SAMA siihen oieaan laskuun tietokoneen tavalla kahdella desimaalilla
100,44
100,01
------------
200,45
Koodi: Valitse kaikki
require 'bigdecimal'
sum = [ BigDecimal.new("100.4445"), BigDecimal.new("100.0115")]
total = 0
sum.each do |v|
total += v
puts v.round(2).to_f
end
puts "--------"
puts total.round(2).to_f
Koodi: Valitse kaikki
$ ruby tmp.rb
100.44
100.01
--------
200.46
Esimerkiksi:
100,4444
100,0115
------------
200,4559 ≈ 200,46
Kuitenkin tuolla pyöristystekniikallasi:
100,44
100,01
------------
200,45
-
- Viestit: 2748
- Liittynyt: 18.1.2010 klo 22.37
- Paikkakunta: Lahti
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja Delli »
Minä olen yleensä koodannut tuon ALV-jutun niin että ensin lasken ALV:n koko laskun loppusummasta, sitten lasken ja näytän sitä rivikohtaisesti, viimeiselle riville ALV:ia ei lasketa vaan viedään se puuttuva osuus (laskun loppusummasta laskettu ALV - kaikkien edellisten rivien yhteenlaskettu ALV), näin ne täsmää aina.
Jos viimeiselle riville tulee joskus 1 snt ylimääräistä tai siitä puuttuu 1 snt verrattuna laskennalliseen niin ei vaikuta mitään koska laskun loppusummasta laskettu ALV ja rivien ALV:t yhteensä täsmäävät.
Ja tuosta pyöristyksestä, olen aina tehnyt noin kun verohallinnon ohjeessa on kerrottu.
Jos viimeiselle riville tulee joskus 1 snt ylimääräistä tai siitä puuttuu 1 snt verrattuna laskennalliseen niin ei vaikuta mitään koska laskun loppusummasta laskettu ALV ja rivien ALV:t yhteensä täsmäävät.
Ja tuosta pyöristyksestä, olen aina tehnyt noin kun verohallinnon ohjeessa on kerrottu.
Viimeksi muokannut Delli, 4.1.2014 klo 21.23. Yhteensä muokattu 3 kertaa.
iPhone 12 64GB
iPad (2018) 32GB Wi-Fi, Apple TV 4rd 4K
MacBook Air 2019, Apple Watch 9.0 44mm
iPad (2018) 32GB Wi-Fi, Apple TV 4rd 4K
MacBook Air 2019, Apple Watch 9.0 44mm
-
- Viestit: 4702
- Liittynyt: 4.11.2007 klo 13.32
- Paikkakunta: Tampere
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja atheos »
Tai mitenkäs vaikka kaupan alalla jos kone laskee hinnaksi 27,02€ ja asiakas maksaa käteisellä 27,00€? Laskutusohjelma antaa 157,01€ summaksi ja myyjä näpyttelee korttipäätteeseen vahingossa 157,00€? Tulee niitä pieniä heittoja ihan muutenkin kuin pelkästä pyöristyksestä. Kuulemma jotkin ohjelmat laskevat eri tavalla joten ehkä sinunkin kannattaisi kokeilla eri kirjanpito-ohjelmaa? Tai jos käytät esim. Exceliä niin siinä kuulemma kun vaihtaa solun tyypiksi currency niin se laskee eri kaavalla kuin muuten. Kuulemma, tämä ei siis ole omakohtaista tietoa.Jamac kirjoitti:Tuyo verohallinnon ohje perustuu vain ja ainoastaanb siihen, että tietokoneet kautta linjan laskevat nuo pyöristykset väärin, ja ilman tuota ohjetta ongelmia tulee liikaa. Se on niin.
http://www.edilex.fi/kilaohje/alvkirj3#2_10:
Tietty voi myös olla ovela ja myös hinnoitella tuotteensa/palvelunsa niin, että summista ei aiheudu pyöristysongelmia. Esim. 200,00€ sis. ALV 24% vaihdatkin 198,40€ tai 201,50€ jolloin ALV 0% summa ei ole 161,29032258 vaan 160,00 tai 162,50.Laskutuksen tai maksun yhteydessä suoritetusta rahamäärän pyöristyksestä tai veron laskentatavasta johtuen liiketapahtumaan saattaa liittyä merkitykseltään vähäinen oikaisuerä. Hyvän kirjanpitotavan sisältämä olennaisuuden periaate huomioon ottaen tällainen erä voidaan merkitä liiketoiminnan muihin kuluihin.
Mac mini • MBA 11" • iPhone 5s • iPad (3rd gen)
http://irc.fi/atheos • http://www.mikseri.net/user/atheos
http://irc.fi/atheos • http://www.mikseri.net/user/atheos
-
- Viestit: 76
- Liittynyt: 5.11.2010 klo 12.17
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja jalski »
Eikös laskennan voi yksinkertaisesti tehdä fixed-point decimal luvuilla? Tällöin voidaan laskea aina halutulla tarkkuudella ja ilman pyöristysvirheitä. Lopputuloksen senttien pyöristämisenkään ei pitäisi tuottaa ongelmia.Jamac kirjoitti:Laskussahan ongelma esiintyy niin, että laskulle pitää kirjoittaa laskurivien yhteensä sarakkeen summa kahdella desimaalilla. Tämä on ns. veroton nettohinta. Tässä vaiheessa on siis pakko pyöristää kahteen desimaaliin
100,4445
100,0115
------------
200,46
Ylläoleva on allekkain laskettuna yksiselitteisesti oikein, eikö?
Tulostetaanpa tämä SAMA siihen oieaan laskuun tietokoneen tavalla kahdella desimaalilla
100,44
100,01
------------
200,45
Esim. PL/I:llä:
Koodi: Valitse kaikki
/* määrittele fixed decimal muuttujat */
dcl summa fixed dec(15,4);
dcl tulos fixed dec(15,2);
/* laske summa, pidä desimaalit mukana */
summa = 100.4445;
summa += 100.0115;
/* pyöristä, pudota ylimääräiset desimaalit pois*/
tulos = summa + 0.0050;
-
- Viestit: 116
- Liittynyt: 9.12.2008 klo 18.33
- Paikkakunta: Nokia
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja Hunssi »
Haluat siis tavallaan "vierittää" tuon viimeisen vitosen mukaan pyöristykseen.Jamac kirjoitti:Niin koodaappa desimaaliluvun pyöristysalgoritmi jollain "geneerisellä tavalla", eli että sen voi toteuttaa millä tahansa haluamallaan ohjelmointikielellä.
Algoritmi ottaa vastaan desimaaliluvun jossa on [0…n] -desimaalia (okei, ei tarvi hyväksyä ääretöntä määrää desimaaleja, mutta koodi ei saa jumiutua yllätyksiin) ja lopullisen halutun desimaalien määrän. Jos haluat hifistellä, niin voit koodata niin että voi pyöristää luvun myös isompaan kuin desimaaliin, eli ykkösiin, kymmeniin… satoihin… jne. (ehkä siten että haluttujen desimaaalien määrän olisi negatiivinen).
Vinkki: tietääkseni tämä ei onnistu valmiilla funktioilla.
Esimerkkiluku kahteen [2] desimaaliin: 0,344444445 => 0,35
Eli jos sinulla on ylläoleva liukuluku, jossa ajattelet olevan 9 merkitsevää desimaalia ja haluat pyöristää sen kahteen desimaaliin, niin sinun pitää pyöristää se ensin 8 desimaaliin, sitten 7, jne. kunnes sinulla on kaksi desimaalia.
Esim. tähän tapaan käyttäen C:tä ja standardia floor() ja pow() -funktioita
Koodi: Valitse kaikki
double round(double lfValue)
{
return floor(lfValue + 0.5);
}
double jamac_round(double lfValue, int cDecimalsIn, int cDecimalsOut)
{
lfValue *= pow(10, cDecimalsIn);
while (cDecimalsIn > cDecimalsOut)
{
lfValue /= 10;
lfValue = round(lfValue);
cDecimalsIn--;
}
lfValue /= pow(10, cDecimalsOut);
return lfValue;
}
(Late 1975)
-
- Viestit: 35
- Liittynyt: 19.11.2011 klo 13.17
- Paikkakunta: Jyväskylä
Re: Haaste: Koodaa pyöristysalgoritmi
Viesti Kirjoittaja Danie »
Ottamatta kantaa siihen miten verot yms. asiat lasketaan, tekisin tuon algoritmin seuraavasti:
1. Etsi pilkun jälkeen ensimmäinen numero, joka on 3 tai pienempi. Miksi? No kolmonen tai pienempi ei enää nouse vitoseksi millään ilveellä, eli numerosarjan tutkinnan voi aloittaa siitä.
2. Etsi ensimmäinen numero tuosta kohti pilkkua, jossa on ensin 5 tai suurempi ja lisää 1 kaikkiin sitä ennen oleviin numeroihin.
Tämä syntyi äkkiä ajatellen aamutuimaan, ensimmäisen kahvikupillisen jälkeen. Tuota täytyy jatkaa, koska pilkun vasemmalla puolella olevat luvut voivat myös korottua.
Itse en pidä silmukoista, joten käyttäisin luultavasti regular expressonia. Meniköhän tämä nyt ihan oikein?
1. Etsi pilkun jälkeen ensimmäinen numero, joka on 3 tai pienempi. Miksi? No kolmonen tai pienempi ei enää nouse vitoseksi millään ilveellä, eli numerosarjan tutkinnan voi aloittaa siitä.
2. Etsi ensimmäinen numero tuosta kohti pilkkua, jossa on ensin 5 tai suurempi ja lisää 1 kaikkiin sitä ennen oleviin numeroihin.
Tämä syntyi äkkiä ajatellen aamutuimaan, ensimmäisen kahvikupillisen jälkeen. Tuota täytyy jatkaa, koska pilkun vasemmalla puolella olevat luvut voivat myös korottua.
Itse en pidä silmukoista, joten käyttäisin luultavasti regular expressonia. Meniköhän tämä nyt ihan oikein?
Palaa sivulle “Ohjelmointi, skriptit ja palvelimet”
Hyppää
- Yleiset aiheet
- ↳ Ajankohtaista Apple-maailmasta
- ↳ Käyttöjärjestelmät
- ↳ Ohjelmat
- ↳ Yleiskeskustelu
- Mac ja oheislaitteet
- ↳ Yleiskeskustelu laitteista
- ↳ MacBook, MacBook Pro ja MacBook Air
- ↳ iMac
- ↳ Mac mini
- ↳ Mac Pro ja Mac Studio
- ↳ Ongelmia Macin kanssa?
- iPhone, iPad ja Apple Watch
- ↳ iPhone-, iPad- ja Apple Watch -laitekeskustelu
- ↳ iPhone-, iPad- ja Apple Watch -ohjelmat sekä iOS
- ↳ Ongelmia iPhonen, iPadin tai Apple Watchin kanssa?
- Huviksi ja hyödyksi
- ↳ Off-topic
- ↳ Kuva ja graafinen suunnittelu
- ↳ Audio ja musiikki
- ↳ Video, televisio ja elokuvat
- ↳ Pelit ja pelaaminen
- ↳ Ohjelmointi, skriptit ja palvelimet
- ↳ Tietoturva ja varmuuskopiointi
- ↳ Verkot, mobiilidata ja muut puhelimet
- ↳ Retronurkka
- ↳ Foorumin ylläpito
- Kauppapaikka
- ↳ Myydään Mac
- ↳ Myydään iPhone, iPad ja iPod
- ↳ Myydään muut Applen tuotteet
- ↳ Myydään muuta tietotekniikkaa
- ↳ Ostetaan Mac
- ↳ Ostetaan iPhone, iPad ja iPod
- ↳ Ostetaan muut Applen tuotteet
- ↳ Ostetaan muuta tietotekniikkaa
- ↳ Vaihdetaan, annetaan, työtä haetaan ja tarjotaan
- ↳ Kauppapaikan keskustelu ja hintavinkit