Próbuję wydrukować maks. 4 cyfry po przecinku w C++ (Korzystanie ze strumieni). Więc jeśli liczba nie potrzebuje 4 cyfr po przecinku, chcę, żeby używała tylko liczby dziesiętnej, której faktycznie potrzebuje.Wydrukuj maks. 4 miejsca dziesiętne
Przykłady:
1.12345 -> 1.1234
1.0 -> 1
1.12 -> 1.12
1.12345789 -> 1.1234
123.123 -> 123.123
123.123456 -> 123.1234
Próbowałem std::setprecision(4)
ale ustawia liczbę cyfr znaczących i zawodzi w przypadku testu:
123.123456 gives 123.1
Próbowałem też dając std::fixed
wraz z std::setprecision(4)
ale daje ustalona liczba cyfr po przecinku, nawet jeśli nie jest potrzebna:
1.0 gives 1.0000
Wygląda na to, że std::defaultfloat
jest tym, czego potrzebuję, a nie naprawionym ani wykładniczym. Wydaje się jednak, że nie drukuje on liczby cyfr po przecinku i ma tylko opcję dla cyfr znaczących.
Wymagałoby to kodu niestandardowego, pracującego nad BCD lub ciągiem znaków przedstawiającym drukowaną wartość. Należy pamiętać, że ponieważ podstawowa reprezentacja liczby zmiennoprzecinkowej jest binarna, niekoniecznie jest to dokładna reprezentacja binarna (powiedzmy) 123.123. Jeśli pokazałeś wystarczająco dużo miejsc po przecinku, coś w stylu 'double x = 123.123; cout << x' może wypisać coś takiego jak '123.1230000001'. Dlatego sugerowałbym napisanie funkcji, która konwertuje double do ciągu znaków z czterema miejscami po przecinku, a następnie usuwa wszelkie końcowe zera za miejscem dziesiętnym, zanim zwróci ciąg znaków. – Simon
Twoje przykłady nie pasują do opisu problemu. Patrząc na te przykłady, bardziej przypominasz nie więcej niż 4 miejsca po przecinku, bez żadnych końcowych zer. To z pewnością nie to samo, co dokładnie 4 miejsca dziesiętne. Poza tym, jak zauważył Simon, biorąc pod uwagę charakter reprezentacji wartości zmiennoprzecinkowych IEEE, będziesz musiał przedstawić lepszą specyfikację tego, co oznacza słowo "potrzebuje cyfry" *. – IInspectable
[Co każdy informatyk powinien wiedzieć o arytmetyki zmiennoprzecinkowej] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) to prawdopodobnie wymagane czytanie. – IInspectable