Найти - Пользователи
Полная версия: Округление до исходного
Начало » Центр помощи » Округление до исходного
1 2
stitrace
Добрый день!

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

Пример:

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

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

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

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

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

Заранее благодарю.
doza_and
stitrace
порядок точности исходного неизвестен.
так а что это такое? Если количество десятичных знаков после запятой, то это будет проблематично.
Пример python 2.6^
>>> 345.6
345.60000000000002
Ввел мало знаков - получил много. Внутреннее представление плавающих чисел позволяет узнать сколько есть двоичных знаков а не десятичных. Приведенные два числа эквивалентны.
Попробуйте уточнить - что вы имеете ввиду под порядком точности, может тогда и получится его вычислить.
Андрей Светлов
doza_and, у вас Python 2.6?
doza_and
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32)
Да надо конечно на 3.2 переходить, но работы много и библиотеки держат. :)
Андрей Светлов
В 2.7 тоже поправили.
Наверное, вы помните мой опус: http://asvetlov.blogspot.com/2011/02/formatting.html
stitrace
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, при этом мне не важна особо точность (можно округлением, можно обрезанием), но преобразовывать в строки и отрезать не хотелось бы, хочется изящного.

Количество знаков после запятой в возвращаемом значении, должно быть строго равно количеству знаков после запятой в значении которое подаётся на вход функции.
Андрей Светлов
Понимаете ли, у float нет такого понятия “количество знаков после запятой”. У decimal есть, а у float — нет. По определению.
doza_and
вот вам средство которое поможет поискать следы знаков после запятой
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'
Короткие плавающие лежат вот в таком формате в машине.
GaiveR
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()
Я вас правильно понял?
Isem
Андрей Светлов
В 2.7 тоже поправили.
Такое даже в 3.2 не поправили:
>>> 345.6+0.1
345.70000000000005
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