Разделить большое целое число на большое целое число, умножить обратно, и получить исходное число
Перед прочтением, не торопитесь закидывать ссылками на теорию - помогите практически решить проблему с реальным методом Имеется целое число "a", которое нужно разделить на другое целое "b" и получить дробь "c". Затем обратным преобразованием дробь "c" умножить на делитель "b" и получить делимое "a".
Пример: число 8993229949524469768 разделить на 63 в 11 степени (62050608388552823487 если быть точным) и полученный результат умножить на 63 в 11 степени. Вот только питон выдаёт следующий результат 8993229949524469572. Ещё ни разу не получилось вернуть любому другому числу исходный вид.
Если делить целое на целое, то получим целое. В данном случае a/b= 0. Значит либо одно из чисел, прописав в переменные, задать дробным форматом a= 1.0 или дать тип данных a=float(89....)
Проблема номер 2: если число сразу привести к виду a=float(8993229949524469768), то оно уже автоматом на "print a" будет показывать другой результат (8993229949524469760). Вроде как число хоть и длинное, но в диапазон вещественных попадает. Не должно меняться. Что делать? Как дальше жить? Калькулятор на win7 помогал создавать алгоритм на основе примера, но на практике python рушит все надежды и мечты. Помогите
Ответы (1 шт):
Используйте класс Fraction (fraction - дробь, внутри число хранится как пара целых чисел (числитель и знаменатель дроби), а не число с плавающей точкой). Пример:
# coding: utf-8
from fractions import Fraction
# "Неточный" вариант
print float(8993229949524469768) / 62050608388552823487 * 62050608388552823487
print int(float(8993229949524469768) / 62050608388552823487 * 62050608388552823487)
# Точный вариант через дроби
print Fraction(8993229949524469768, 62050608388552823487) * 62050608388552823487
# Или так
print Fraction(8993229949524469768) / 62050608388552823487 * 62050608388552823487
Результат:
8.99322994952e+18
8993229949524470784
8993229949524469768
8993229949524469768
Тут нужно заметить, что даже просто при преобразовании числа 8993229949524469760 в число с плавающей точкой теряется точность:
print int(float(8993229949524469768))
# Выведет 8993229949524469760
Дело в том, что хотя число попадает в диапазон значений чисел с плавающей точкой, но выходит за диапазон возможных значений мантиссы и фактический диапазон целых чисел, которые можно хранить в виде числа с плавающей точкой: от - 2 ** 53 до + 2 ** 53, т.е. от -9007199254740992 до 9007199254740992 (см. Precision limitations on integer values) - из-за этого данное число нельзя точно представить в виде числа с плавающей точкой.
По поводу вот этого:
Если делить целое на целое, то получим целое. В данном случае a/b= 0. Значит либо одно из чисел, прописав в переменные, задать дробным форматом a= 1.0 или дать тип данных a=float(89....)
Можно сделать импорт from __future__ import division, тогда деление целого на целое будет давать число с плавающей точкой (как в Python 3):
from __future__ import division
print 8993229949524469768 / 62050608388552823487
Результат: 0.144933791675