Форум сайта python.su
Да не в round дело. Python 2.7 использует другой алгоритм для преобразования float в str. Вот и получается разный вывод для одних и тех же чисел.
Сам round не изменился и работает как и прежде.
Офлайн
Ну тогда уж так (если принимать во внимание количество требуемых цифр после запятой):
def round( num, dig ):
dec = 10**dig
return int(num*dec+0.5)/dec
Офлайн
Ставим эксперимент:
import sqlite3
con = sqlite3.connect('test.sqlite3')
cur = con.cursor()
cur.execute('create table if not exists test (x)')
cur.execute('insert into test(x) values (?)', (round(4.3111111, 2),))
cur.execute('select * from test')
for row in cur: print row
con.commit()
con.close()
(4.3099999999999996,)
ox@blackstar:~$ sqlite3 test.sqlite3
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from test
...> ;
4.31
sqlite>
IsemКаллиграфическим подчерком выписываем слова гуру:
Вы сами то поняли, что сказали? Вы путаете три вещи: …
Андрей СветловМедитируем над бумажкой три дня и торжественно обещаем никогда не морочить коллегам голову самодельными round.
Вы различаете двоичную запись и текстовое представление для float?
И то, что многие дроби можно записать двумя способами, 4.31 одна из них?
Офлайн
Кстати, то что 4.309(9) = 4.31 доказывается методом математической индукции. Помню это еще в школе в 10-м классе учили. Это так, к слову.
Офлайн
Subideal OxБумажку желательно перед этим хорошенько размять :)
Медитируем над бумажкой три дня и торжественно обещаем никогда не морочить коллегам голову самодельными round.
Subideal Oxи
Это и есть тот самый хваленый питон
Андрей СветловИмеем конфуз.
The disadvantage is that many people found the output to be confusing (mistaking intrinsic limitations of binary floating point representation as being a problem with Python itself).
Офлайн
regallМожет быть дедукции?
Кстати, то что 4.309(9) = 4.31 доказывается методом математической индукции.
Офлайн
Нет, всё же это именно “математическая индукция”: http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D1%8F
Офлайн
Андрей СветловЗначит Конан Дойль ошибся.
Нет, всё же это именно “математическая индукция”: http://ru.wikipedia.org/wiki/%D0%9C%D0% … 0%B8%D1%8F
Офлайн
IsemА парень не сдается! :D Молодец, гасконец. Так держать!
Может быть дедукции?
Офлайн
Давайте споим себя, что делает pickle? Правильно, он записывает 8 байт (само число) и “окружение”. Это число имеет (эти самые 64 бита) одинаковый вид что в питоне 2.7, что 2.6, что 1.7, что 3.1, потому что это IEEE. И что же у нас получается? Разные представления одного и того же числа! (боже мой).
Subideal OxА что мне еще остается делать?
А парень не сдается! Молодец, гасконец. Так держать!
Отредактировано (Фев. 5, 2011 00:01:27)
Офлайн