Некорректный вывод суммы двух дробных чисел в форматированной строке

Всем доброго дня!

Учусь на курсах по программированию. При решении задачи "пользователь вводит 3 числа, проверить можно ли составить из них треугольник, если да то какой треугольник?" написал вот такой код:

    print('Введите длины трех отрезков:')
    
    a = float(input('a = '))
    b = float(input('b = '))
    c = float(input('c = '))
    print(f'a = {a}, b = {b}, c = {c}')
    print(f'a+b = {a+b}, b+c = {b+c}, c+a = {c+a}')
    
    if a + b >= c and a + c >= b and b + c >= a:
        if a == b or b == c or c == a:
            if a == b and a == c:
                print('Треугольник равносторонний')
            else:
                print('Треугольник равнобедренный')
        else:
            print('Треугольник разносторонний')
    else:
        print('Невозможно построить треугольник по заданным параметрам')

При тестировании кода столкнулся с такой проблемой: если при вводе в дробной части вводимых чисел встречаются [6 и 7] или [1 и 2], то сумма a+b, b+c или c+a принимает вид длинной дроби. Например:

a = >? 10.06
b = >? 10.07
c = >? 10.06
a = 10.06, b = 10.07, c = 10.06
a+b = 20.130000000000003, b+c = 20.130000000000003, c+a = 20.12

Условия появления данного бага:

  1. Для 6 И 7:
  • Третье число может быть любым, в том числе равным одному из остальных.
a = >? 9.6
b = >? 9.7
c = >? 145
a = 9.6, b = 9.7, c = 145.0
a+b = 19.299999999999997, b+c = 154.7, c+a = 154.6
  • 6 и 7 должны быть в одном разряде. 8.6 и 9.07 не дадут такого результата.

  • Целая часть от 8 до 15 включительно (при нахождении в десятых долях). В комбинациях [7.6, 7.6, 7,7] и [16.3, 16.6, 16.7] такого явления нет.

  • При нахождении в сотых долях целая часть от 1 до 31 включительно.

  • Проверка условий в ветвях if/else никак не влияет на этот "феномен". Тестирую в отдельном файле без ветвления if/else.

При нахождении в сотых долях баг проявился при сложении 8 и 7:

a = >? 0.08
b = >? 0.07
c = >? 0.02
a = 0.08, b = 0.07, c = 0.02
a+b = 0.15000000000000002, b+c = 0.09000000000000001, c+a = 0.1


a = >? 1.08
b = >? 1.06
c = >? 1.07
a = 1.08, b = 1.06, c = 1.07
a+b = 2.14, b+c = 2.13, c+a = 2.1500000000000004

Также подобное возникает при сложении 1 и 2:

a = >? 9.1
b = >? 9.1
c = >? 9.2
a = 9.1, b = 9.1, c = 9.2
a+b = 18.2, b+c = 18.299999999999997, c+a = 18.299999999999997

Проблема проявляется и в тысячных долях.

Вопрос: в чем причина этого бага и как можно это фиксить?

p.s.: Мне известно об округлении %.2f. Однако хочется понять причину и решить проблему.

UPD: Получен ответ по теме Вычисления на числах с плавающей точкой не работают


Ответы (0 шт):