Число с е преобразовать в нормальный вид
В базе данных есть числа с е-0, степени всегда разные, как привести такие числа в нормальный вид? Я искал информацию и находил, но только единичные решения, а мне нужно, чтобы все числа с разными степенями приводило в нормальный вид, например, число 6.935e-07 чтобы стало 0.0000006935. Я написал такую функцию, но она очень тупая, завязана на количестве нулей и походу сильно грузит, так как скрипт крашнулся с Memory Error, когда до нее дошел. Есть какое-то решение проще?
def check_normal_number(number):
new_number = 0
if 'e-' in str(number):
zero_needed = int(str(number)[-1]) - 1
z = int(number * (10 ** (int(str(number)[-1]) + 3)))
new_number = f'0.{"0" * zero_needed}{z}'
return new_number
UPD: Делюсь решением для тех, кто ищет, помогли в ответах: {k} - это число знаков после запятой. Для числа в моем виде оно всегда будет = степень (7) + актуальное число знаков после запятой (3) Откидываем все начиная с е, считаем количество знаков и отнимаем 2 (первый символ и точка) и прибавляем степень.
number = 6.935e-07
k = len(str(number).split('e')[0]) - 2 + int(str(asks_volume[2])[-1])
number = f'{number:.{k}f}'
Ответы (3 шт):
6.935e-07 самая оптимальная форма записи, не нужно считать не значащие нули и т.п., но если есть острая необходимость есть не оптимальный вариант.
import math
print(f'{math.pi:50.50f} \n{math.e:50.50f} \n{6.935e-07:50.50f}')
3.14159265358979311599796346854418516159057617187500
2.71828182845904509079559829842764884233474731445312
0.00000069350000000000000938127613786532421613628685
Как видно у последнего числа есть мусор эти моменты нужно отслеживать. Лучше использовать нормальную форму записи с мантиссой и порядком.
Это же вопрос представления. Если вам приходит именно число, то просто печатайте его в нужном вам виде:
number = 6.935e-07
print(f'{number:.10f}')
# 0.0000006935
А если приходит строка, то просто преобразуйте её предварительно в число и точно так же печатайте:
number = float('6.935e-07')
print(f'{number:.10f}')
# 0.0000006935
Собственно, f-строки можно и не печатать - это обычные строки, можете их куда хотите сохранять.
По вопросу из комментария - число знаков вывода можно тоже указать в переменной:
number = float('6.935e-07')
k = 10
print(f'{number:.{k}f}')
Я еще поэкспериментировал и придумал сделать вот так:
if 'e-' in str(number):
main_part = str(asks_volume[2]).replace('.', '').split('e')[0]
zeros = int(str(asks_volume[2])[-1]) - 1
number = f'0.{"0" * zeros}{main_part}'
Подходит под все варианты до e-09 степени. В моем случае больше 9 не бывает, но если кто решит взять такой вариант - то дополнительно это подкрутить несложно. В чем суть моего варианта: допустим число - 6.935e-07 main_part - удаляет точку и все, что после е zeros - считает количество нулей, необходимое после запятой по формуле - последний знак (то есть, 7) минус 1 и в конце выводит 0.{нужное кол-во нулей}{основная часть} Новый вариант - 0.0000006935