LINUX.ORG.RU

float to str. facepalm.

 


0

1

Я могу еще понять что у кого-то из разработчиков терминал 1971 года выпуска. Но на кой черт во внутренних функциях так делать?

>>> i = 0.00000000001
>>> str(i)
'1e-11'

А что не так-то? Хочешь специфический формат – укажи его.

Deleted
()

Потому что удобней, чем нули считать.

anonymous
()
Ответ на: комментарий от anonymous

Не понимаю зачем это использовать внутри языка, а не только в выводе. Вот очень мне вставляет дроч вида: «{0:.8f}».format

steemandlinux ★★★★★
() автор топика

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

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Офигенно удобная вещь, если мне надо поменять точность переменной, превращается в секс с комментариями и плюсиками.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

Но это еще фигня, потому что чтобы отправить мне этот float в виде str для rest запроса, надо сначала через жопу посчитать количество цифр в оригинальном числе, а потом в «{0:.8f}» засунуть переменную. Офигенно я скажу.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Ну если в требованиях str с определенной точностью, то что я должен делать так? Ну не может быть это число выше определенной точности.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

Ну если в требованиях str с определенной точностью, то что я должен делать так? Ну не может быть это число выше определенной точности.

Объясни что именно мешает тебе перевести в строку с заданной точностью.

Deleted
()

Наоборот, удобно. До момента, когда становится трудно на глаз определить количество ноликов (0.00001), str() возвращает запись с десятичной точкой. Меньше число - уже удобней экспонента.

anonymous
()
Ответ на: комментарий от steemandlinux

Нужно считать цифру, потому что точность в разных ситуациях разная.

Какую цифру? Требуемое количество знаков после запятой? Так тебе, похоже, в любом случае это как-то считать и куда-то задавать придётся, раз уж сам сказал, что она может быть разной в разных ситуациях.

Deleted
()
Ответ на: комментарий от Deleted

Ну попробуй:

Есть оригинальное число:

0.00000067

8 цифр после запятой.

Его умножили на 5.78, получили 0,000003873 - 9 цифр.

Мне надо его POST запросом отправить в виде str '0,00000387'.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Вот в том и проблема, что я не могу использовать:

precision = len(str(0.00000067).split('.')[1])

А потом str(round(0.00000067*5.78, precision))

Мне приходится трахаться с комментариями, чтобы сделать формат и грузить лишнюю функцию.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

А точно, он же все превращает в строки.

steemandlinux ★★★★★
() автор топика

Мда. Я знал, что те кто блюют от bash-а радугой не умеют в программирование.

peregrine ★★★★★
()
Ответ на: комментарий от steemandlinux

Ну попробуй:

Есть оригинальное число:

0.00000067

8 цифр после запятой.

Твои проблемы начинаются уже тут. «0.00000067» не имеет точного представления в виде двоичного числа с плавающей точкой.

>>> i = 0.00000067
>>> '%.10f' % i
'0.0000006700'
>>> '%.20f' % i
'0.00000067000000000000'
>>> '%.40f' % i
'0.0000006700000000000000437966178080950730'
>>> '%.80f' % i
'0.00000067000000000000004379661780809507298783955775434151291847229003906250000000'

=)

Я бы просто всегда при преобразовании float -> str делал это с максимальным разумным количеством знаков после запятой. И не пытался применить тут какую-либо странную магию.

Deleted
()
Ответ на: комментарий от Deleted

Твои проблемы начинаются уже тут. «0.00000067» не имеет точного представления в виде двоичного числа с плавающей точкой.

Ну окей, разменяй $0.03

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

0.03 тоже нельзя представить в виде двоичного floating point.

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

Deleted
()
Ответ на: комментарий от beastie

Жду следующей темы, когда ты узнаешь о IEEE 754.

У меня от таких тем дежавю уже. Стабильно ~раз в год подобное тут всплывает.

Deleted
()

С чего ты взял, что в памяти float представлен 0.00000000001, с чего бы str его должен представлять какты хочешь ?

Dred ★★★★★
()
Ответ на: комментарий от steemandlinux

мне этот float в виде str для rest запроса,

А в каком формате у тебя тело запроса? JSON вполне понимает экспоненциальную нотацию.

In [1]: import json

In [2]: json.dumps({'foo': 0.000000000001})
Out[2]: '{"foo": 1e-12}'
provaton ★★★★★
()

Но на кой черт
Вот очень мне вставляет дроч вида: «{0:.8f}».format

Это пистон, детка, здесь всё сделано через ж-пу,
привыкай или переходи в Ruby.

Novator ★★★★★
()
Ответ на: комментарий от Novator

если вам нужна строка «0.000000000001» — храните в памяти строку и не будет проблем если вам нужно дробное число — узнайте, как такие числа обрабатывает ЕВМ и не задавайте глупых вопросов если вам нужно разменять $0.03 — храните в памяти 3 цента числом 3 как делает весь белый мир

краткая лекция для упорышей окончена, всем спасибо за внимание

anonymous
()
Ответ на: комментарий от anonymous

чертовы переносы, простите, но парсите сами

anonymous
()
Ответ на: комментарий от anonymous

Автор включил мозг, и ему стало стыдно.

i-rinat ★★★★★
()
Ответ на: комментарий от steemandlinux

Ну окей, разменяй $0.03

Разве в школе не учат, что использовать float’ы для денежных операций нельзя?

EXL ★★★★★
()
Ответ на: комментарий от steemandlinux

len(str(0.00000067).split('.')[1])

split('.')

Напомнило php-шный код который пришлось дебажить однажды. Там человек делимость числа на 7 проверял как «есть ли запятая в строке str(x/7)». И долго удивлялся почему у него вёрстка календаря в таблицу съезжает при переезде на другой хостинг. С другой дефолтной локалью.

alpha ★★★★★
()
Ответ на: комментарий от steemandlinux

precision = len(str(0.00000067).split(‘.’)[1])

Есть короче бизнес идея. Когда заработает наконец космический туризм, запустить тв-шоу: выбирается программист, ему полностью оплачивают билет и ещё добавляют сверху, но он должен сам запрограммировать автопилот и систему жизнеобеспечения корабля на котором полетит. Я бы с удовольствием вложился чтобы отправить тебя и посмотреть на это.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.