Найти - Пользователи
Полная версия: Форматирование вещественых чисел.
Начало » Python для экспертов » Форматирование вещественых чисел.
1 2
balu
Такая проблема : из базы данных (использую kinterbasdb) вытягивается вещественное число. Реальное число - 5.3, однако в программе оно отображается как 5.299999. В моем случае эта погрешность имеет смысл. Есть ли какой способ заставить возвращать именно 5.3 или, хотя бы, выставить округление?
slivlen
Используй decimal вместо float.
poltergeist
5.299999 - это что-то похоже на бок интерпретатора, возможно это бред, но проверь на всяк случай:)
Вот что умеет показывать интерпретатор:
>>> 0.1
0.10000000000000001
>>> 5.3
5.2999999999999998
Если в этом бок, то вот ещё почитать: http://docs.python.org/tut/node16.html#SECTION0016100000000000000000
Jenyay
Можно округлить при выводе строки, например как “%.3f” % (5.3)
balu
poltergeist
Если в этом бок, то вот ещё почитать: http://docs.python.org/tut/node16.html# … 0000000000
Не совсем. Поле у меня numeric(15, 5). Kinterbasdb отдает строку “2.03999” вместо “2.04”. Хотя корень в том, что вы описали. Вот и пришлось округлять.

Jenyay
Можно округлить при выводе строки, например как “%.3f” % (5.3)
Это наилучшее решение. Decimal работает, но часто выдает результат в экспоненциальной форме и не понравился он мне.

Конечный код:

def formatFloat(number, scale=2):
if number == “”: return number
n = number.split(“.”)
if len(n) == 1 : return n
if number == ‘9’ and len(n) >= scale: number = number +'9'
a = “%.”+str(scale)+'f'
a = a % (float(number))
return a.rstrip('0')

Viper
str вполне нормально округляет число, в отличии от repr.
Например:

>>> str(0.23)
'0.23'
>>> repr(0.23)
'0.23000000000000001'
balu
Viper
str вполне нормально округляет число, в отличии от repr.
А у меня str. Это kinterbasdb страдает…
Андрей Светлов
Есть еще fpformat.fix. Хоть он и ограниченный несколько
poltergeist
balu
Я так понял, что вы получаете данные в строковом виде и выводить тоже должны также, но красиво.

Как-то всё громоздко у вас, может так:

def formatFloat(number, scale=2):
return str(round(float(number), scale))


Вот пример:

>>> formatFloat(“234.2359999999998”, 5)
'234.236'
balu
poltergeist
Как-то всё громоздко у вас, может так
Спасибо. за round я как-то запямятовал :(
Этот код
a = “%.”+str(scale)+'f'
a = a % (float(number))
return a.rstrip('0')
теперь заменил на вашу конструкцию.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB