2011-01-24 14 views
47

Próbuję napisać liczbę do dwóch miejsc po przecinku przy użyciu printf() następująco:dwóch miejsc po przecinku printf()

#include <cstdio> 
int main() 
{ 
    printf("When this number: %d is assigned to 2 dp, it will be: 2%f ", 94.9456, 94.9456); 
    return 0; 
} 

Kiedy uruchamiam program, otrzymuję następujący wynik:

# ./printf 
When this number: -1243822529 is assigned to 2 db, it will be: 2-0.000000 

Dlaczego tak jest?

Dzięki.

+1

Część -1234 ... reprezentuje 32-bitowy zmiennoprzecinkowy jako liczbę całkowitą. Druga część jest błędna, powinieneś mieć% 2.2f, ale nadal nie mogę wytłumaczyć -0.0000 ... część. Mam jeden poprawny wynik, z tym wyjątkiem, że uruchomienie kodu powoduje dodatkowe 2 przed floatem. –

+1

@nvm: Zera pojawiają się, ponieważ 94.9456 zostało przesunięte na stos jako podwójne (8 bajtów), a% d przetworzyło pierwsze 4 bajty jako liczbę całkowitą, a kolejne 4 bajty były zerami, a kod odczytał te 4 końcowe bajty z pierwszej liczby plus wiodące 4 bajty drugiego spławika i starały się traktować je jako podwójne. Odpowiedź była tak mała, że ​​format stałoprzecinkowy traktował ją jako zero. A to działało na chipie Intela, a nie na maszynie RISC. –

+0

Wygląda na to, że wstawianie liczby całkowitej przed "f", tak jak "% 10f", nie ma żadnego wyniku, tak jak to jest jak pisanie "% f"? Próbowałem tego i po prostu otrzymałem wynik tak, jakby to było "% f". –

Odpowiedz

101

Co chcesz to %.2f, a nie 2%f.

Również warto wymienić %d z %f;)

#include <cstdio> 
int main() 
{ 
printf("When this number: %f is assigned to 2 dp, it will be: %.2f ", 94.9456, 94.9456); 
return 0; 
} 

Wyjście to będzie:

Gdy ten numer: 94,945600 jest przypisany do 2 dp, to będzie: 94,95

Zobacz tutaj pełny opis opcji formatowania printf: printf

6

Zastosowanie: "%.2f" lub odmiany.

Zobacz specyfikację POSIX dla autorytatywnej specyfikacji ciągów w formacie printf(). Zauważ, że oddziela dodatki POSIX od podstawowej specyfikacji C99. Istnieje kilka witryn C++, które pojawiają się w wyszukiwarce Google, ale niektóre mają przynajmniej wątpliwą reputację, sądząc po komentarzach widzianych gdzie indziej na SO.

Ponieważ kodujesz w C++, prawdopodobnie powinieneś unikać printf() i jej krewnych.

-2

Spróbuj użyć formatu jak% d.% 02d

int iAmount = 10050; 
printf("The number with fake decimal point is %d.%02d", iAmount/100, iAmount%100); 

Innym podejściem jest typem rzucił ją podwoić przed wydrukowaniem korzystając% f tak:

printf("The number with fake decimal point is %0.2f", (double)(iAmount)/100); 

Moje 2 centów :)

Powiązane problemy