Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2007 09:41:55

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

Такая проблема : из базы данных (использую kinterbasdb) вытягивается вещественное число. Реальное число - 5.3, однако в программе оно отображается как 5.299999. В моем случае эта погрешность имеет смысл. Есть ли какой способ заставить возвращать именно 5.3 или, хотя бы, выставить округление?



Офлайн

#2 Авг. 17, 2007 10:05:29

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

Используй decimal вместо float.



Офлайн

#3 Авг. 22, 2007 15:05:41

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

5.299999 - это что-то похоже на бок интерпретатора, возможно это бред, но проверь на всяк случай:)
Вот что умеет показывать интерпретатор:

>>> 0.1
0.10000000000000001
>>> 5.3
5.2999999999999998
Если в этом бок, то вот ещё почитать: http://docs.python.org/tut/node16.html#SECTION0016100000000000000000



Отредактировано (Авг. 22, 2007 15:08:45)

Офлайн

#4 Авг. 22, 2007 20:38:10

Jenyay
От:
Зарегистрирован: 2007-08-10
Сообщения: 173
Репутация: +  1  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

Можно округлить при выводе строки, например как “%.3f” % (5.3)



Офлайн

#5 Авг. 23, 2007 11:06:56

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

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')



Отредактировано (Авг. 23, 2007 11:12:26)

Офлайн

#6 Авг. 23, 2007 11:28:37

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

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

>>> str(0.23)
'0.23'
>>> repr(0.23)
'0.23000000000000001'



Офлайн

#7 Авг. 23, 2007 11:39:28

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

Viper
str вполне нормально округляет число, в отличии от repr.
А у меня str. Это kinterbasdb страдает…



Офлайн

#8 Авг. 23, 2007 13:31:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Форматирование вещественых чисел.

Есть еще fpformat.fix. Хоть он и ограниченный несколько



Офлайн

#9 Авг. 23, 2007 14:33:03

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

balu
Я так понял, что вы получаете данные в строковом виде и выводить тоже должны также, но красиво.

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

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


Вот пример:

>>> formatFloat(“234.2359999999998”, 5)
'234.236'



Офлайн

#10 Авг. 23, 2007 16:06:26

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Форматирование вещественых чисел.

poltergeist
Как-то всё громоздко у вас, может так
Спасибо. за round я как-то запямятовал :(
Этот код
a = “%.”+str(scale)+'f'
a = a % (float(number))
return a.rstrip('0')
теперь заменил на вашу конструкцию.



Отредактировано (Авг. 23, 2007 16:17:38)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version