РЕДАКТИРОВАТЬ: я не прав.Я оставлю этот ответ здесь, чтобы остальная часть темы имела смысл, но это не так.Пожалуйста, смотрите ответ Джона Мачина выше.Спасибо, ребята =).
Если вышеприведенные ответы сработают, это здорово - это избавит вас от многих неприятных взломов.Однако, по крайней мере, в моей системе, они не будут.Вы можете проверить это, например, с помощью
import sys
print( "%.30f" % sys.float_info.epsilon )
Это число является наименьшим числом с плавающей запятой, которое ваша система может отличить от нуля.Все, что меньше этого, может быть случайным образом добавлено или вычтено из любого числа с плавающей точкой при выполнении операции. Это означает, что, по крайней мере, в моей настройке Python точность теряется в кишках xlrd
, и, похоже,Вы ничего не можете сделать, не изменив его.Что странно;Я бы ожидал, что этот случай произошел раньше, но, очевидно, нет!
Возможно, можно изменить локальную установку xlrd
, чтобы изменить приведение float
.Откройте site-packages\xlrd\sheet.py
и перейдите к строке 1099:
...
elif rc == XL_INTEGER:
rowx, colx, cell_attr, d = local_unpack('<HH3sH', data)
self_put_number_cell(rowx, colx, float(d), self.fixed_BIFF2_xfindex(cell_attr, rowx, colx))
...
Обратите внимание на приведение float
- вы можете попробовать изменить его на decimal.Decimal
и посмотреть, что произойдет.