Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Luku tekstiksi kahden desimaalin tarkkuudella

mika132 [16.05.2014 11:07:07]

#

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.

Tzaeru [16.05.2014 12:40:56]

#

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.

feenix [16.05.2014 14:42:52]

#

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.

Tzaeru [16.05.2014 15:37:43]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta