Я создаю калькулятор прямо сейчас, и когда я ввожу запись или даже оболочку, которая использует eval, как мой калькулятор, 3-0.1 - это не 2,9, как обычный калькулятор. Это дает вам очень длинные числа, например 2,8999999999. Как это исправить и сделать всегда округлым?
Если вы делаете какие-либо действия, которые явно преобразуются в строку, вы должны использовать форматирование строки, чтобы указать именно тот формат, который вы хотите отобразить, как в Ответ Боба. Если вы используете DoubleVar
и позволяете Tcl / Tk выполнять форматирование за вас, это немного сложнее.
Причина, по которой эти числа не совсем то, что вы ожидаете, заключается в ошибка с плавающей запятой. Если вы хотите выполнять «более правильные» численные вычисления, взгляните на библиотеки Python decimal
и fractions
.
Вы можете округлить результат, используя функцию round()
.
Использование: round(number, no. of decimal places)
Например:
num1 = 1/3
num2 = round(num1, 2) # num2 would be 0.33
num3 = 2/3
num4 = round(num3, 3) # num4 would be 0.667
Вы должны использовать форматирование строки для вывода вашей программы:
https://docs.python.org/3.6/library/string.html#format-string-syntax
Т.е.
float_result = 3 - 0.1
formatted_to_two_decimal_places = '{:.2f}'.format(float_result)
# or you can do ... = f'{float_result:.2f}' in python 3.6+
print(formatted_to_two_decimal_places)
@abarnert Раньше Python гордился тем, что у него есть только один очевидный способ делать что-то конкретное. Сколько сейчас существует способов форматирования строк?
@MarkRansom Функция format
- это один из очевидных способов форматирования одиночного значения. Это не то же самое, что объединить несколько форматированных значений и статический текст, так почему это должна быть одна и та же функция?
@MarkRansom Если вы не спрашиваете о f-струнах и str.format
. str.format
предназначен для обратной совместимости, потому что еще в 2006 году никто не думал о хорошем дизайне, но это не делает их хорошим выбором для нового кода; f-струны - один из очевидных способов сделать это.
Как вы показываете стоимость? Вы явно устанавливаете содержимое
Entry
илиLabel
? Вызовvar.set(str(n))
наStringVar
? Вызовvar.set(n)
наDoubleVar
? …?