Tämmöinen pienimuotoinen ongelma pyöristämisestä.
Eli miksi tuo testi -muuttuja antaa lopputulokseksi 1357, mutta testi2 antaa halutun (1300) tasaluvun? Laskutoimitukset ovat sinällään ihan samat tietääkseni...
Jälkeenpäin tosin opin että pyöristämiseen on myös olemassa valmiita keinoja, mutta päätimpä kysyä silti.
#include <iostream> int main() { int testi = 1234; testi = ((testi * 1.1) / 100) * 100; // mikä tässä on vikana? std::cout << testi << std::endl; // tulostaa 1357 int testi2 = 1234; testi2 = testi2 * 1.1; testi2 = testi2 / 100; testi2 = testi2 * 100; std::cout << testi2 << std::endl; //tulostaa 1300 }
edit: testattu ubuntu 9.10 ja siinä olevalla g++ kääntäjällä.
Ensimmäisessä tapauksessa väliarvot ovat liukulukuja ja vain lopputulos muutetaan kokonaisluvuksi. Vaikka muuttuja testi on kokonaisluku, sen kertominen liukuluvulla muuttaa tyypin liukuluvuksi. Toisessa tapauksessa taas jokainen väliarvo muutetaan kokonaisluvuksi.
Tarvittaessa tyyppiä voi muuttaa itse seuraavaan tapaan:
testi = (int)((testi * 1.1) / 100) * 100;
Ongelmahan tuli alunperin siitä, että olin jo SDL testeissä käyttänyt samanlaista taktiikkaa ristinollan tekemiseen.
Eli:
hiiri_x = (event.button.x / 200) * 200
Pelikentän koko oli 600x600. Luin hiiri_x muuttujaan hiiren x-sijainnin jaettuna 200, jolloin sain arvon 0, 1 tai 2. Eli jos hiiren x koordinaatti oli kohdass 300, niin 300/200 tuotti pelille arvon 1.
Sitten kerroin tuon arvon 200, jolloin tiesin mihin kohtaan piirtäminen piti suorittaa. Eli esimerkkitapauksessa piirtäminen aloitettiin kohdasta 200.
Ovatko nämä tilanteet nyt jotenkin samanlaiset/erilaiset vai miksi ei vaan pieni pää tajua missä vika :) ?
Ilmeisesti event.button.x on kokonaisluku, jolloin tilanne on erilainen. Kun kokonaisluku (event.button.x) jaetaan kokonaisluvulla (200), myös lopputulos on kokonaisluku. Mutta kun liukuluku (testi * 1.1) jaetaan kokonaisluvulla (100), lopputulos on liukuluku.
Tässä on vielä yksi tapa toteuttaa pyöristys:
testi = testi * 1.1; testi = (testi / 100) * 100;
Jees, tuo selkeyttää asiaa melkoisesti.
Kiitokset.
testi = testi * 1.1;
voi myös kirjoittaa kokonaislukuina jottei muunnosta tarvita
testi = testi * 11 / 10;
Kannattaa myös huomata, että useimmat (jos yksikään) esitetyistä tavoista ei pyöristä lähimpään satalukuun.
User137:n esimerkkiä mukaellen:
testi = ((testi * 11 + 500) / 1000) * 100;
Aihe on jo aika vanha, joten et voi enää vastata siihen.