В Python есть несколько типов нецелых чисел:
x = 1 / 2
даст вам стандартное число с плавающей точкой . Его тип float
, он по сути тот же, что и в C, он обрабатывается аппаратно и имеет те же проблемы, что и все остальные float
в мире.
Однако существует также дробный тип :
from fractions import Fraction
x = Fraction(1, 2)
, которая имеет точную арифметику с рациональными числами.
Если вы хотите выполнить округление, но вас не устраивает количество значащих цифр на вашем компьютере или тот факт, что оно может различаться на разных платформах, десятичный тип ваш друг:
from decimal import Decimal
x = Decimal('0.5')
Вы сможете установить его точность, скажем, до 100 цифр, если хотите. Или установите значение 2 для банковских приложений.
Пока компьютеры тупые, нам, вероятно, понадобится много разных типов. По крайней мере, в соответствии с принципами Pythonic, Python требует от вас явного выбора того, что вы хотите от своих чисел.
Кроме того, это большое недоразумение, что точная арифметика не приводит к проблемам с округлением. Каждый раз, когда вы округляете точное значение, чтобы сделать что-то полезное для пользователя - например, распечатайте его пользователю или добавьте столько долларов на банковский счет пользователя - вы столкнетесь со «странным поведением» округления. Это присуще нецелочисленной арифметике.