гугл молчит а форматирование строк (единственное что было в гугле) не подходит так как там требуется точно указывать сколько знаков до и после запятой а у меня данные самые разношерстные
@cckyi_boxxxНапиши функцию, которая работает с числом как со строкой. Из строки 1e-8 можно извлечь каждую часть с помощью регулярного выражения и дальше каждую из них превратить в число. Потом эти числа можно использовать для добавления нулей. То есть для вычисления используешь некрасивые, но точные числа, а для показывания пользователям приводишь их к красивому виду.
необходимо избавиться от отображения с экспонентой и прийти к виду 0.00000001 , это надо для отображения пользователю (строковый формат), как это сделать ?
from decimal import * tsz = 1e-8 with localcontext( Context(prec = 32, rounding = ROUND_05UP , Emin = 0 , Emax = 0 , clamp=1 , capitals=0) ): tsz = Decimal(str(tsz) ) print(tsz)
@cckyi_boxxxЗачем?
пробовал запретить экспоненту
>>> '{:e}'.format(1) '1.000000e+00' >>> '{:e}'.format(123) '1.230000e+02' >>> '{:e}'.format(123.456) '1.234560e+02' >>> '{:e}'.format(0.00123456) '1.234560e-03' >>>
@cckyi_boxxxДа это обычное дело: когда хочешь пользователю вывести что-то определённое, ты делаешь для этого функцию. Не надо пытаться питон поднастроить, а тем более воздействовать на сами числа из-за их внешнего вида, меняя что-то в них самих.
если воспользоваться вашим советом то это получится довольно размашистый код
@cckyi_boxxxДумаю что нет лаконичного способа, просто потому что это никому не нужно. Если нужен Decimal то его и передают по сети, если приходит float то все нормальные люди понимают что 1.5 и 1.4999999999999 это одно и тоже. А любой разумный вывод как раз легко форматами настраивается, не зря алгоритмы форматирования при выводе уже десятки лет неизменны.
полагаю должен быть более лаконичный способ.
doza_andну по сети все летит json-ом и соответствующий модуль питона для работы с этим форматом переводит все числа с плавающей точкой во float, и возможно-ли этому модулю “обьяснить” что надо сразу в decimal я не знаю , поэтому поставил такой костыль и он работает.
Если нужен Decimal то его и передают по сети
@cckyi_boxxxjson как формат не поддерживает Decimal и у него не предусмотрены методы передачи доп информации о типе (в отличии например от yaml). Классическое решение при отправке преобразовать все Decimal в строки, а при получении отконвертировать их назад. При этом не будет потерь. Ну или использовать более подходящий протокол обмена.
по сети все летит json-ом
>>> len("1.0000000000000000209225608301284726753266340892878361046314239501953125") 72
Rodegastокругление не спасет. так как на выходе тот-же float просто один мусор поменяется на другой или вовсе останется прежним как в приведенном ниже примере, + ошибки при математических операциях, я подумывал юзать numpy или pandas, у них свои типы и работают они точно, но в моем случае их не очень удобно использовать, возможно под питон есть что-то позволяющее работать точно как numpy но не с массивами а с переменными (кроме Decimal)?
Если важна точность, то надо её определить и округлять входные данные и результаты вычислений до этой точности.
tsz = 1e-8 with localcontext( Context(prec = 32, rounding = ROUND_05UP , Emin = 0 , Emax = 0 , clamp=1 , capitals=0) ): print(Decimal(tsz)) tsz = round(tsz, 8) print(Decimal(tsz)) >>> 1.0000000000000000209225608301284726753266340892878361046314239501953125e-8 1.0000000000000000209225608301284726753266340892878361046314239501953125e-8