2012-09-14 31 views
5

Wydaje się, że jakiś niejasnych błędów zaokrąglania kiedy uruchomić następujący kod:Wynik odlewania double do int jest źle

int roundedTotal = (int)(PriorityJob * 100.0); 

Początkowo PriorityJob = 1.4 i roundedTotal jest niezdefiniowany. Ocena PriorityJob * 100.0 w tym momencie daje 140. Następnie roundedTotal = 139.

Najwyraźniej 140.0 jest interpretowane jako 139,99999. Czy jest to niedobór silnika zmiennoprzecinkowego? Nigdy czegoś takiego nie widziałem.

+1

nigdy nie widziałem liczb zmiennoprzecinkowych w przybliżeniu? –

+4

1.4 nie istnieje jako float. W rzeczywistości istnieje nieskończona liczba liczb nawet pomiędzy 1,0 a 2,0, których nie można przedstawić w postaci liczby zmiennoprzecinkowej, a 1,4 to jedna z nich. Zostaje zapisany w przybliżeniu w postaci 1.4, jako 1.3999999999999999 – nos

+0

@LuchianGrigore Wydaje się, że jest to prosta operacja. Dlaczego miałby się tak nie udać? –

Odpowiedz

10

Prawie każdy nowoczesny komputer używa binary representation dla liczb zmiennoprzecinkowych.

Jak 1/3 = 0.33333333... nie można przedstawić tak, jak ułamek dziesiętny tak 1/10 (a więc i wartości po przecinku najbardziej liczbami całkowitymi, w tym 1.4) nie mogą być przedstawione dokładnie jak frakcja binarnego. Zamiast tego będzie reprezentowana przez najbliższą reprezentowalną wartość, która może być nieco większa lub mniejsza od "prawdziwej" wartości.

Może chcesz zaokrąglić do najbliższej liczby całkowitej Zamiast: (int)(PriorityJob * 100.0 + 0.5)

+1

A różnica wyświetlanych wartości pojawia się, ponieważ 'std :: cout << PriorityJob * 100.0' runduje, a' int roundTotal = PriorityJob * 100.0' upuszcza część ułamkową. –

Powiązane problemy