Я экспериментирую с самым быстрым способом форматирования числа с плавающей точкой в виде строки с минимально возможным представлением (без конечных 0, без десятичных разрядов, если это возможно, без научной c записи). Я решил попробовать модуль Python ctypes
.
Основываясь на нескольких примерах, я думал, что эта функция будет работать, но вместо этого она всегда печатает b'0.000000'
при использовании %f
или b'5.25124e-315'
при использовании %g
Код:
from ctypes import *
import msvcrt
def floatToStr3(n:float)->str:
libc = cdll.msvcrt
print("n in:", n)
sb = create_string_buffer(100)
libc.sprintf(sb, b"%g", c_float(n))
print("sb out:", sb.value)
return sb.value
import random
floatToStr3(random.random())
floatToStr3(random.random())
floatToStr3(random.random())
floatToStr3(random.random())
floatToStr3(random.random())
floatToStr3(random.random())
Вывод:
n in: 0.9164215022054657
sb out: b'5.25662e-315'
n in: 0.6366531536720886
sb out: b'5.23343e-315'
n in: 0.07371310207853521
sb out: b'5.1052e-315'
n in: 0.6353450576077702
sb out: b'5.23332e-315'
n in: 0.2839487624658935
sb out: b'5.18628e-315'
n in: 0.5540225836869241
sb out: b'5.22658e-315'
У меня сильное чувство, что я просто неправильно использую create_string_buffer, но я не знаю, что ответ является. Форматирование с использованием ints работает.
Использование Python 3.7.4 на Windows 10.