Як округлити до 2 десяткових знаків за допомогою Python?


254

Я отримую багато десяткових знаків на виході цього коду (конвертер Фаренгейта до Цельсія).

Наразі мій код виглядає так:

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

Отже, моє запитання полягає в тому, як я змушую програму обирати кожну відповідь на 2-й десятковий раз?


7
Невелике зауваження щодо вашого коду. Немає жодної причини, щоб значення Фаренгейта зберігалося як глобальне, достатньо (і краще) передати його як параметр вашим функціям. Отже, видаліть «глобальну лінію Фаренгейта». У функції formeln перейменуйте параметр у функцію "Fahreinheit" formeln (Fahreinheit). Що стосується округлення, ви можете просто використовувати параметри "%" для відображення лише перших двох цифр, і для цих цифр воно повинно бути округлене. На кількість цифр, наведених у формулі, у формі не впливає.
arieli

Відповіді:


443

Ви можете використовувати roundфункцію, яка приймає за свій перший аргумент число, а другий аргумент - точність після десяткової крапки.

У вашому випадку це було б:

answer = str(round(answer, 2))


21
Це називається заокруглення банкірів. Він кругляє до парного числа. Він відповідає стандарту IEEE 754 для чисел з плаваючою комою. en.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz

37
Я не впевнений, що спонукало людей підтримати вищезазначений коментар. Натомість, той факт, що round(2.675, 2)дає, 2.67а не 2.68має нічого спільного з округленням Банкіра.
Марк Дікінсон

3
Примітка : це змінює значення відповіді. Якщо ви хочете просто округляти для відображення, піти з відповіддю @Johnsyweb - stackoverflow.com/a/20457284/1498405
hardmooth

4
@Johnsyweb Я пробую це сьогодні, через рік після оригінальної публікації, і це виглядає як слід. Здається, круглий () розвивався з часом. Дивіться нижче: раунд (1.379, 2) -> 1.38 раунд (1.372, 2) -> 1.37 раунд (1.375, 2) -> 1.38
НічFurry

82

Використання синтаксисуstr.format() 's для відображення з двома знаками після коми (без зміни базового значення ): answeranswer

def printC(answer):
    print("\nYour Celsius value is {:0.2f}ºC.\n".format(answer))

Де:

  • :вводить специфікацію формату
  • 0 дозволяє знаки з нульовим накладом для числових типів
  • .2встановлює точність до2
  • f відображає число як номер фіксованої точки

3
Це найкорисніша відповідь ІМО - зберігає фактичну цінність недоторканою і її просто реалізувати! Дякую!
BrettJ

Не знаю чому, але формат "{: 0.2f}". (0.5357706) дає мені "0.54" (python 3.6)
Ноам Пелед

3
@NoamPeled: Чому це не слід? 0.5357...ближче, 0.54ніж до 0.53, тому округлення 0.54має сенс.
ShadowRanger

"{:0.2f}".format(1.755)-> 1,75 "{:0.2f}".format(1.7551)-> 1,76 - Однак я б обох очікував рівним 1,76.
Янотан

(Версія Python: 3.6.10)
Janothan

48

Більшість запропонованих відповідей roundабо format. roundіноді закруглюється вгору, і в моєму випадку мені знадобилося, щоб значення моєї змінної було округлене вниз, а не просто відображалося як таке.

round(2.357, 2)  # -> 2.36

Тут я знайшов відповідь: Як округлити число з плаваючою комою до певного знаку після коми?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

або:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d

1
Я схвалив - це те, що я шукав; Мені подобається ваша робота з python-poloniex: D
Skylar Saveland

2
"значення округляються до найближчого кратного 10 до потужності мінус ndigits;" docs.python.org/3/library/functions.html#round так ні, раунд не завжди округлюється, наприкладround(2.354, 2) # -> 2.35
Піт Кіркхем,

@PeteKirkham ви праві, я відредагував свою відповідь, щоб зробити більш розумним і точним.
s4w3d0ff

2
-0.54 - правильна відповідь на округлення -0.5357706 вниз, оскільки це від'ємне число, -0.54 <-0.53
s4w3d0ff

2
Я б використав 10**dзамість цього int('1' + ('0' * d)).
Джонатан Райнхарт


8

Ви хочете округлити свою відповідь.

round(value,significantDigit)це звичайне рішення для цього, проте це іноді не працює, як можна було б очікувати з математичної точки зору, коли цифра негайно поступається (ліворуч) цифрі, яку ви округляєте, має5 .

Ось кілька прикладів такої непередбачуваної поведінки:

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

Якщо припустити, що ви маєте намір зробити традиційне округлення для статистики в науках, це зручна обгортка, щоб roundфункція працювала так, як очікувалося, потребуючи importдодаткових матеріалів, таких як Decimal.

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

Ага! Отже, виходячи з цього, ми можемо зробити функцію ...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)

В основному, це додає дійсно невелике значення рядку, щоб змусити його правильно закріплюватись у непередбачуваних випадках, коли це звичайно не відповідає roundфункції, коли ви цього очікуєте. Зручне значення додати, 1e-Xде Xдовжина номер рядка , яку ви намагаєтеся використовувати roundна плюс1 .

Підхід до використання 10**(-len(val)-1)був навмисним, оскільки це найбільше невелике число, яке ви можете додати для зсуву, а також гарантуючи, що додане вами значення ніколи не змінює округлення, навіть якщо десятків .немає. Я міг би використовувати лише 10**(-len(val))умовно, if (val>1)щоб відняти 1більше ... але простіше просто завжди віднімати те 1, що це не змінить сильно застосованого діапазону десяткових чисел, яким цей спосіб вирішення може правильно впоратися. Цей підхід не вдасться, якщо ваші значення досягають меж типу, це не вдасться, але майже для всього діапазону дійсних десяткових значень він повинен працювати.

Тож готовий код буде приблизно таким:

def main():
    printC(formeln(typeHere()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nYour Celsius value is " + answer + " C.\n"

main()

... повинен дати вам очікувані результати.

Ви можете також використовувати десяткову бібліотеку для досягнення цієї мети , але обгортка я пропоную простіше і може бути кращим в деяких випадках.


Edit: Дякую Blckknght за вказівку на те , що 5справа бахроми відбувається тільки за певних значеннях тут .


6

Просто використовуйте форматування з% .2f, що дає вам округлення до 2 десяткових знаків.

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

4

Ви можете використовувати оператор форматування рядків python "%". "% .2f" означає 2 цифри після коми після коми.

def typeHere():
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/library/stdtypes.html#string-formatting


4

Ви можете використовувати круглий оператор до 2 знаків після коми

num = round(343.5544, 2)
print(num) // output is 343.55

3

Можна скористатися функцією кругла.

round(80.23456, 3)

дасть вам відповідь 80.234

У вашому випадку використовуйте

answer = str(round(answer, 2))

2

Якщо вам потрібно уникнути проблеми з плаваючою комою з на округленні чисел для обліку, ви можете використовувати нумеру.

Вам потрібно встановити numpy:

pip install numpy

і код:

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

відбитки

2.67
2.68

Ви повинні використовувати це, якщо керуєте грошима за допомогою законного округлення.


1

Ось приклад, який я використав:

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)

1

Не знаю чому, але формат "{: 0.2f}". (0.5357706) дає мені "0.54". Єдине рішення, яке працює для мене (python 3.6), полягає в наступному:

def ceil_floor(x):
    import math
    return math.ceil(x) if x < 0 else math.floor(x)

def round_n_digits(x, n):
    import math
    return ceil_floor(x * math.pow(10, n)) / math.pow(10, n)

round_n_digits(-0.5357706, 2) -> -0.53 
round_n_digits(0.5357706, 2) -> 0.53

Це обрізання, а не округлення.
ShadowRanger


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.