Форум сайта python.su
Добрый день!
Помогите сделать округление результата мат операции до исходного, если порядок точности исходного неизвестен.
Пример:
dig1 = 5987*0.001
dig2 = round(dig1, x)
в dig2 должно быть целое число
dig1 = 1.456*0.001
dig2 = round(dig1, x)
в dig2 должно быть число с точностью до 3 знака после запятой.
Т.е. это у меня должна быть некая функция, в которую, вводя любое число, получаешь результат умножения его на 0.001 (или какое либо другое) округлённый до разряда исходного.
Заранее благодарю.
Офлайн
stitraceтак а что это такое? Если количество десятичных знаков после запятой, то это будет проблематично.
порядок точности исходного неизвестен.
>>> 345.6
345.60000000000002
Отредактировано (Авг. 4, 2011 20:57:08)
Офлайн
doza_and, у вас Python 2.6?
Офлайн
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32)
Да надо конечно на 3.2 переходить, но работы много и библиотеки держат. :)
Отредактировано (Авг. 4, 2011 21:53:30)
Офлайн
В 2.7 тоже поправили.
Наверное, вы помните мой опус: http://asvetlov.blogspot.com/2011/02/formatting.html
Офлайн
doza_andКороче говоря мы имеем функцию в которую на вход подаётся любое число. К примеру это может быть и 11201 и 1.155778, далее в функции происходит некое математическое действо (умножение, деление и так далее), а на выход должно возвращаться число точно такого же порядка (округление).stitraceтак а что это такое? Если количество десятичных знаков после запятой, то это будет проблематично.
порядок точности исходного неизвестен.
Пример python 2.6^Ввел мало знаков - получил много. Внутреннее представление плавающих чисел позволяет узнать сколько есть двоичных знаков а не десятичных. Приведенные два числа эквивалентны.>>> 345.6
345.60000000000002
Попробуйте уточнить - что вы имеете ввиду под порядком точности, может тогда и получится его вычислить.
Офлайн
Понимаете ли, у float нет такого понятия “количество знаков после запятой”. У decimal есть, а у float — нет. По определению.
Офлайн
вот вам средство которое поможет поискать следы знаков после запятой
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'
Офлайн
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()
Офлайн
Андрей СветловТакое даже в 3.2 не поправили:
В 2.7 тоже поправили.
>>> 345.6+0.1
345.70000000000005
Офлайн