Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2011 16:01:58

stitrace
От:
Зарегистрирован: 2011-04-16
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Округление до исходного

Добрый день!

Помогите сделать округление результата мат операции до исходного, если порядок точности исходного неизвестен.

Пример:

dig1 = 5987*0.001
dig2 = round(dig1, x)

в dig2 должно быть целое число

dig1 = 1.456*0.001
dig2 = round(dig1, x)

в dig2 должно быть число с точностью до 3 знака после запятой.

Т.е. это у меня должна быть некая функция, в которую, вводя любое число, получаешь результат умножения его на 0.001 (или какое либо другое) округлённый до разряда исходного.

Заранее благодарю.



Офлайн

#2 Авг. 4, 2011 20:54:58

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Округление до исходного

stitrace
порядок точности исходного неизвестен.
так а что это такое? Если количество десятичных знаков после запятой, то это будет проблематично.
Пример python 2.6^
>>> 345.6
345.60000000000002
Ввел мало знаков - получил много. Внутреннее представление плавающих чисел позволяет узнать сколько есть двоичных знаков а не десятичных. Приведенные два числа эквивалентны.
Попробуйте уточнить - что вы имеете ввиду под порядком точности, может тогда и получится его вычислить.



Отредактировано (Авг. 4, 2011 20:57:08)

Офлайн

#3 Авг. 4, 2011 21:24:28

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

Округление до исходного

doza_and, у вас Python 2.6?



Офлайн

#4 Авг. 4, 2011 21:52:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Округление до исходного

Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32)
Да надо конечно на 3.2 переходить, но работы много и библиотеки держат. :)



Отредактировано (Авг. 4, 2011 21:53:30)

Офлайн

#5 Авг. 4, 2011 23:08:05

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

Округление до исходного

В 2.7 тоже поправили.
Наверное, вы помните мой опус: http://asvetlov.blogspot.com/2011/02/formatting.html



Офлайн

#6 Авг. 12, 2011 17:25:25

stitrace
От:
Зарегистрирован: 2011-04-16
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Округление до исходного

doza_and
stitrace
порядок точности исходного неизвестен.
так а что это такое? Если количество десятичных знаков после запятой, то это будет проблематично.
Пример python 2.6^
>>> 345.6
345.60000000000002
Ввел мало знаков - получил много. Внутреннее представление плавающих чисел позволяет узнать сколько есть двоичных знаков а не десятичных. Приведенные два числа эквивалентны.
Попробуйте уточнить - что вы имеете ввиду под порядком точности, может тогда и получится его вычислить.
Короче говоря мы имеем функцию в которую на вход подаётся любое число. К примеру это может быть и 11201 и 1.155778, далее в функции происходит некое математическое действо (умножение, деление и так далее), а на выход должно возвращаться число точно такого же порядка (округление).



def calculate(number):
return number*0.001

len(str(calculate(1.3434)).split('.')) == len(str(number).split('.')) должно быть всегда True, при этом мне не важна особо точность (можно округлением, можно обрезанием), но преобразовывать в строки и отрезать не хотелось бы, хочется изящного.

Количество знаков после запятой в возвращаемом значении, должно быть строго равно количеству знаков после запятой в значении которое подаётся на вход функции.



Офлайн

#7 Авг. 12, 2011 18:36:47

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

Округление до исходного

Понимаете ли, у float нет такого понятия “количество знаков после запятой”. У decimal есть, а у float — нет. По определению.



Офлайн

#8 Авг. 12, 2011 22:50:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Округление до исходного

вот вам средство которое поможет поискать следы знаков после запятой

def binrep(v):
import struct
s=struct.pack("f",v)
iv=struct.unpack('i',s)[0]
return bin(iv)

>>> binrep(1.01)
'0b111111100000010100011110101110'
>>> binrep(1.001)
'0b111111100000000010000011000101'
Короткие плавающие лежат вот в таком формате в машине.



Офлайн

#9 Авг. 13, 2011 01:52:02

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Округление до исходного

def calculate(number):
try:
x = len(str(number).split('.')[1])
except IndexError:
x = 0
number = number * 0.001
return round(number, x)

def main():
print(calculate(5987)) #6.0
print(calculate(1.456)) #0.001


if __name__ == '__main__':
main()
Я вас правильно понял?



Офлайн

#10 Авг. 15, 2011 08:59:47

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Округление до исходного

Андрей Светлов
В 2.7 тоже поправили.
Такое даже в 3.2 не поправили:
>>> 345.6+0.1
345.70000000000005



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version