Задать вопрос
@Glebinho

Поможете исправить ошибку в коде питон?

a, b, n = int(input()), int(input()), int(input())
rub = (a * n) + (b * n) // 100
kop = (((a * n) + (b * n) / 100)-rub) * 100
print(rub, kop)

This is a sample test from the problem statement!

Test input:
10
15
2
Correct output:
20 30

Your code output:
20 30.00000000000007

пишет такой output, хотя вроде все верно и не может получиться такого ответа, вроде закончил 11 классов, поступил конечно не на математика и не на программиста, но не понимаю откуда взялся такой ответ.

еще другая вариация этого кода а там уже пишет invalid syntax, и как теперь решать?
a, b, n = int(input()), int(input()), int(input())
rub = (a * n) + (b * n) // 100
kop = ((a * n) + (b * n) / 100
kop1 = kop - rub
kop2 = kop1 * 100
print(rub, kop2)
  • Вопрос задан
  • 156 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 2
Lord_of_Rings
@Lord_of_Rings Куратор тега Python
Дунадан - северный странник. Злой, но очень добрый
Дробная часть отсекается int-ом int(kop) Во втором примере не закрыта скобка kop = ((a * n) + (b * n)) / 100
Ответ написан
Vindicar
@Vindicar
RTFM!
Дробные числа во многих языках программирования представляются в формате с плавающей точкой. Как это выглядит - можешь погуглить, а сейчас важно знать, что точность этих чисел ограничена, а многие числа (даже сравнительно "несложные" с нашей точки зрения) вообще точно не представимы. Собственно, вышеприведённый сайт (https://0.30000000000000004.com/) подробно это объясняет.
Для многих задач эта погрешность настолько мала, что абсолютно незначительна, поэтому числа с плавающей точкой по прежнему используются. Но эта погрешность медленно, но верно накапливается с каждой операцией, и это нужно иметь ввиду. Так, математически эквивалентные операции могут давать разные результаты:
print(f'{(10 + 20) / 100:.40f}')  # 0.2999999999999999888977697537484345957637
print(f'{0.1 + 0.2:.40f}')  # 0.3000000000000000444089209850062616169453
print(30 / 100 == 0.1 + 0.2)  # False - результаты отличаются!

Решение зависит от того, что, собственно, является проблемой. Если тебе просто нужен красивый вывод, то ты можешь отформатировать число при выводе, например, так:
# вывести значения переменных rub и kop2 
# как числа с плавающей точкой (f), 
# округлив их до 0 знаков после запятой.
print(f'{rub:.0f} {kop2:.0f}')

Этот способ хорош тем, что само значение в переменной не округляется, так что дальнейшие расчёты будут идти без округления.
Альтернативно, ты можешь использовать представление с фиксированной точкой. В твоём случае можно просто вести все расчёты в копейках, а под конец разделять сумму в копейках на рубли и остаток:
total_sum = 1234  # тыт ты рассчитываешь сумму в копейках, я написал число для простоты
rub = total_sum // 100  # оператор // выполняет деление нацело, отбрасывая остаток
kop = total_sum % 100  # оператор % выполняет нахождение остатка от деления
print(rub, kop)  # и rub и kop - целые числа, поэтому погрешности от плавающей точки нет

Как я понял, это ты и пытался сделать, просто не осилил нагуглить оператор деления с остатком.

Третий вариант - развитие второго, только более автоматизированный. Тип данных Decimal как раз и даёт представление числа с фиксированной точкой, хотя работает медленнее. Его часто советуют использовать для финансовых расчётов.
from decimal import Decimal
x = Decimal(30)
print(x, x / 100)  # 30 0.3
print(Decimal('30') / 100 == Decimal('0.1') + Decimal('0.2'))  # True - результат один и тот же!


Думаю, в твоём случае лучше подойдёт вариант 2.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы