Во-первых, в большинстве языков неокрашенная константа, такая как "1.55", обрабатывается как значение двойной точности. Тем не менее, 1,55 не совсем точно представляется как значение двойной точности, потому что у него нет завершающего представления в двоичном виде. Это вызывает много любопытных поведений, но один эффект заключается в том, что когда вы набираете 1.55, вы на самом деле не получаете значение, которое находится точно на полпути между 1.5 и 1.6.
В двоичном формате десятичное число 1,55:
1.10001100110011001100110011001100110011001100110011001100110011001100...
Когда вы набираете «1,55», это значение фактически округляется до ближайшего представимого значения двойной точности (во многих системах ... но есть исключения, к которым я доберусь). Это значение:
1.1000110011001100110011001100110011001100110011001101
что немного больше чем 1,55; в десятичном виде это точно:
1.5500000000000000444089209850062616169452667236328125
Таким образом, когда его просят округлить это значение до одной цифры после десятичного знака, оно округлит до до 1,6. Вот почему большинство комментаторов сказали, что они не могут дублировать поведение, которое вы видите.
Но подождите, в вашей системе, «1,55» округлено вниз , а не вверх. Что происходит?
Это может быть несколько разных вещей, но наиболее вероятно, что вы находитесь на платформе (возможно, Windows), которая по умолчанию выполняет арифметику с плавающей запятой, используя инструкции x87, которые используют другой (80-битный) внутренний формат. В 80-битном формате 1,55 имеет значение:
1.100011001100110011001100110011001100110011001100110011001100110
что немного меньше чем 1,55; в десятичном виде это число:
1.54999999999999999995663191310057982263970188796520233154296875
Поскольку оно меньше 1,55, оно округляется на вниз , когда округляется до одной цифры после десятичной точки, давая результат "1,5", который вы наблюдаете.
FWIW: в большинстве языков программирования режим округления по умолчанию на самом деле «округление до ближайшего, привязка к четному». Просто, когда вы задаете дробные значения в десятичном виде, вы почти никогда не достигнете точного значения на полпути, поэтому непрофессионалу может быть трудно это наблюдать. Вы можете увидеть это, хотя, если посмотреть, как «1.5» округляется до нуля:
>>> "%.0f" % 0.5
'0'
>>> "%.0f" % 1.5
'2'
Обратите внимание, что оба значения округляются до четных чисел; ни один не округляет до «1».
Редактировать: в своем пересмотренном вопросе вы, похоже, переключились на другой интерпретатор python, для которого с плавающей запятой используется двойной тип IEEE754, а не 80-битный тип x87. Таким образом, «1,55» округляет вверх , как в моем первом примере, но «5,55» преобразуется в следующее двоичное значение с плавающей запятой:
101.10001100110011001100110011001100110011001100110011
что точно:
5.54999999999999982236431605997495353221893310546875
в десятичном виде; так как это меньше чем 5,55, оно округляется вниз .