AKTUALIZACJA: Odpowiedź była dokładna w momencie pisania, a precyzja zmiennoprzecinkowa nadal nie jest czymś, co domyślnie uzyskujesz za pomocą to_csv / read_csv (kompromis między precyzją a wydajnością; domyślne wartości sprzyjają wydajności).
W dzisiejszych czasach istnieje argumentem dostępne i argumentem dostępne .float_format
pandas.DataFrame.to_csv
float_precision
pandas.from_csv
Oryginał jest nadal wart przeczytania, aby lepiej zrozumieć problem.
To był błąd w pandach, nie tylko w funkcji „to_csv”, ale także w „read_csv”. Nie jest to ogólna kwestia zmiennoprzecinkowa, mimo że prawdą jest, że arytmetyka zmiennoprzecinkowa jest tematem wymagającym pewnej uwagi od programisty. Poniższy artykuł wyjaśnia nieco ten temat:
http://docs.python.org/2/tutorial/floatingpoint.html
Klasyczny jednolinijkowy, który pokazuje „problem”, to ...
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
... który nie wyświetla 0,3, jak można by się spodziewać. Z drugiej strony, jeśli wykonujesz obliczenia za pomocą arytmetyki stałoprzecinkowej i dopiero w ostatnim kroku zastosujesz arytmetykę zmiennoprzecinkową , będzie to działać zgodnie z oczekiwaniami. Zobacz:
>>> (1 + 1 + 1) * 1.0 / 10
0.3
Jeśli desperacko potrzebujesz obejść ten problem, polecam utworzenie innego pliku CSV, który zawiera wszystkie liczby jako liczby całkowite, na przykład mnożenie przez 100, 1000 lub inny współczynnik, który okazuje się wygodny. W aplikacji przeczytaj plik CSV w zwykły sposób, a odzyskasz te liczby całkowite. Następnie przekonwertuj te wartości na zmiennoprzecinkowe, dzieląc przez ten sam współczynnik, który pomnożyłeś wcześniej.