Eli olen täysin unohtanut sen enkä googlellakaan löydä oikein mitään. Miten C++/SDL:llä kirjoitettu float teksti saadaan kahden desimaalin tarkkuudelle?
Nimittäin tällä hetkellä näkyy näin:
1.320000
en muista kuinka monta nollaa oli perässä.
ja tarkoitus olisi tietenkin tämä:
1.32.
Mitä meinaat SDL:llä kirjoitetulla tekstillä?
C++:llä float-tyyppisen arvon saa muunnettua String-merkkijonoksi valitulla tarkkuudella esimerkiksi näin:
#include <iostream> #include <sstream> // std::ostringstream löytyy tästä otsikkotiedostosta.. #include <iomanip> // ..ja std::setprecision tästä. std::ostringstream float_tekstina; // Luodaan merkkijonovirta float_tekstina << std::setprecision(3); // Asetetaan annettavien liukulukujen tarkkuus kolmeen. float_tekstina << 1.32363455; // Syötetään liukuluku cout << float_tekstina.str(); // Otetaan virrasta String-merkkijono ja tulostetaan se.
Koodi tulostaisi "1.32".
Muitakin tapoja on, voit esimerkiksi käyttää String-luokan metodeja "find()" ja "substr()". Muunnat liukuluvun ensin String-merkkijonoksi ja sen jälkeen etsit ensiksi mainitulla metodilla pisteen paikan merkkijonossa. Sitten voit jälkimmäistä metodia avuksi käyttäen ottaa merkkijonosta pätkän, jonka pituus on pisteen paikka + haluttu tarkkuus.
Ja jos halutaan aina kaksi desimaalia, eikä kolmea merkitsevää numeroa, tarvitaan vielä std::fixed tuonne. Muutenhan tuolla 12.345 tulostaisi 12.3 eikä 12.34.
Ja jos taas käyttää pisteen paikan hakua, pitää myös huomioida se, että ellei toisin sanota, numero voidaan esittää myös tieteellisessä muodossa. Joten 1.854899E19 vain piste hakemalla muuntuu aika lailla eri numeroksi kuin oli tarkoitus.
feenix kirjoitti:
Ja jos halutaan aina kaksi desimaalia, eikä kolmea merkitsevää numeroa, tarvitaan vielä std::fixed tuonne. Muutenhan tuolla 12.345 tulostaisi 12.3 eikä 12.34.
Hah, aivan, hyvä huomio. Vähän aikaa siitä kun viimeksi tarvinnut näitä standardikirjaston ominaisuuksia mihinkään käyttää.
Joten korjattu koodi:
#include <iostream> #include <sstream> // std::ostringstream löytyy tästä otsikkotiedostosta.. #include <iomanip> // ..ja std::setprecision tästä. std::ostringstream float_tekstina; // Luodaan merkkijonovirta float_tekstina << std::setprecision(3); // Asetetaan annettavien liukulukujen tarkkuus kolmeen. float_tekstina << std::fixed; // Asetetaan annettavien liukulukujen desimaaliosan tarkkuuden käsittely vakiopituiseksi. float_tekstina << 1.32363455; // Syötetään liukuluku cout << float_tekstina.str(); // Otetaan virrasta String-merkkijono ja tulostetaan se.
Aihe on jo aika vanha, joten et voi enää vastata siihen.