2012-06-06 12 views
9

wyjścia poniższym przykładzie 0.29847 kiedy było spodziewać 0.29848:Czy setprecision w C++ round? Jeśli tak, dlaczego to widzę?

double f = 0.298475; 
cout << setprecision(5) << f << endl; 

Dla innych przykładów, jednak obserwuję zaokrąglenia:

double f = 0.123459; 
cout << setprecision(5) << f << endl; 

Wyjścia: 0,12346

i

double f = 0.123454; 
cout << setprecision(5) << f << endl; 

Wyjścia: 0.12345

Odpowiedz

16

0.298475 liczba nie jest dokładnie odwzorowane w double (ponieważ nie jest to ułamek, którego mianownik jest potęgą dwójki, będąc 11939/40000) i rzeczywisty numer, który jest przechowywany jest w rzeczywistości bliżej niż 0.29847 do 0,29848.

+4

0.298474999999999990318855225268634967505931854248046875, a dokładniej. – dan04

+1

Innymi słowy, są dwa kroki zaokrąglania: jeden, gdy literał '0.298475' jest konwertowany na' podwójne', a drugi podczas drukowania pewnej liczby cyfr na 'cout'. – aschepler

+2

@ dan04: To jest nieco pozbawiony znaczenia wyświetlacz; 64-bitowy float IEEE754 zawiera tylko około 17 cyfr dziesiętnych wartości informacji ... –

1

Jak widzę z dokumentacji setprecision() nie wykonuje żadnego zaokrąglenia, ale po prostu ustawia maksymalną liczbę cyfr wyświetlaną po przecinku dziesiętnym. Możliwe reprezentacje liczb podwójnych i zmiennoprzecinkowych mogą różnić się od stałych używanych inicjatorów.

Powiązane problemy