pandas .DataFrame.round () не усекает десятичные значения после желаемого количества мест - PullRequest
1 голос
/ 07 февраля 2020

pandas .DataFrame.round () дает несколько непредсказуемый вывод для следующего фрейма данных. Может кто-нибудь, пожалуйста, помогите мне понять, что здесь происходит?

df = pd.DataFrame([(61.21, 69.32), (65.1938, .67)], columns=['A', 'B'], dtype='float32')
df.round(2)

Вышеприведенный код выводит:

           A      B
0  61.209999  69.32
1  65.190002   0.67

Почему раунд (2) не усекает все, кроме первых 2 цифр после десятичной точки ? Когда я пытаюсь сделать то же самое с dtype = 'float64', он работает и выдает следующее:

df.astype('float64').round(2) 
       A      B
0  61.21  69.32
1  65.19   0.67

Есть ли что-то в значениях во фрейме данных?

Я не хочу форматировать вывод как строку (round (2) .applymap ('{:. 2f}'. Format)), чтобы получить желаемое количество десятичных знаков. Я хочу знать, почему столбцы дают различное количество цифр после десятичной точки.

Я использую pandas версия '0.24.1'.

1 Ответ

0 голосов
/ 07 февраля 2020

Плавающие точки не точны, не каждое число может быть представлено точно. Точно так же 1/3 не может быть точно представлено конечным десятичным числом, есть много чисел, которые не могут быть точно представлены в формате IEEE с плавающей запятой (которые, однако, могут быть представлены в десятичной системе).

В таком случае операции с плавающей запятой, включая округление (до десятичных разрядов), будут возвращать значение в зависимости от выбранного режима округления, обычно это ближайшее число с плавающей запятой.

Это число может быть чуть меньше фактического десятичного значения с двумя десятичными знаками, таким образом, имея много девяток в десятичной записи.

...