web-dev-qa-db-ja.com

Pythonで小数点以下2桁に丸めるにはどうすればいいですか?

このコード(華氏から摂氏への変換プログラム)の出力には、小数部がたくさんあります。

私のコードは現在このように見えます:

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位にすべての答えを丸めるのですか?

127
Dolcens

round 関数を使用することができます。これは最初の引数として数値を取り、2番目の引数は精度です。

あなたの場合、それはそうなるでしょう:

answer = str(round(answer, 2))
227
rolisz

str.format()構文 to display answerを小数点以下2桁で使用します(answerの基礎となる値を変更することなく)

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

どこで:

51
Johnsyweb

質問には「四捨五入する方法を小数点以下2桁まで」と表示されています。

ほとんどの回答はroundまたはformatを提案しました。 roundは四捨五入されることがあり、私の場合は変数のvalueを常に切り捨てる必要がありました(そのように表示されるだけではありません)。

round(2.357, 2)  # -> 2.36

ここにtrueという答えが見つかりました。 浮動小数点数を特定の小数点以下に切り上げる方法は?

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
38
s4w3d0ff
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))
10
Mahadi

%.2fのフォーマットを使用するだけで、小数点以下2桁に切り捨てられます。

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

あなたは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

3
arieli

あなたはあなたの答えを丸めたいです。

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追加のもの[_ SOME_VARIABLE] _を必要とするように動かす便利なラッパーです。

>>> 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))

基本的に、これは文字列に本当に小さい値を追加して、予期したときにDecimal関数で通常は処理されない予測不能なインスタンスを適切に切り上げるよう強制します。追加するのに便利な値は1e-Xです。ここで、roundは、Xroundを加えて、1を加えた長さです。

10**(-len(val)-1)を使うアプローチは、シフトを強制するためにあなたが加えることができる最大の小さい数であると同時に意図的でした、そしてあなたが追加する値が小数点の.がなくても決して丸めを変えないことを保証します。 1を引き算するためにcondiditional 10**(-len(val))と一緒にif (val>1)を使用することができます...しかし1を常に引き算することは、この回避策が適切に処理できる10進数の多くの範囲を変えないので簡単です。あなたの値が型の限界に達すると、このアプローチは失敗するでしょう、これは失敗するでしょう、しかし有効な10進値のほぼ全範囲のためにそれはうまくいくはずです。

完成したコードは次のようになります。

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()

...あなたが期待する結果をあなたに与えるべきです。

これを達成するために decimal ライブラリを使うこともできますが、私が提案するラッパーはもっと単純で、場合によっては好まれるかもしれません。


編集:ありがとう Blckknght5フリンジケースは特定の値に対してのみ発生することを指摘してくれました ここ

2
Jason R. Mick

round 演算子は2桁までの10進数で使用できます

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

これが私が使った例です:

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
Patrick Hill

理由はよくわかりませんが、 '{: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
1
Noam Peled

Round関数を使うことができます。

round(80.23456, 3)

あなたに80.234の答えを与えるでしょう

あなたの場合は、

answer = str(round(answer, 2))

お役に立てれば :)

1
Satyaki Sanyal

回答を10進数で表示したいので、printC()関数で answer 変数をstrに型キャストする必要はありません。

それから printf-style文字列フォーマットを使用します

0
codiacTushki
round(12.3956 - 0.005, 2)  # minus 0.005, then round.

答えはからです: https://stackoverflow.com/a/29651462/8025086

0
buxizhizhoum