Pythonで小数点以下2桁に丸める方法は?


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位までのすべての回答をプログラムでどのように丸めるのですか?


6
コードに関する簡単な説明。華氏の値をグローバルとして保持する理由はありません。関数へのパラメーターとして送信するのに十分です(それ以上)。したがって、「華氏」の行を削除します。formeln関数で、パラメーターの名前を関数 "Fahreinheit" formeln(Fahreinheit)に変更します。丸めに関しては、「%」パラメーターを使用して最初の2桁のみを表示することができ、これらの桁に対して丸める必要があります。formelnの式で提供される桁数には影響しません。
arieli 2013

回答:


443

round最初の引数として数値を受け取り、2番目の引数が小数点以下の精度である関数を使用できます。

あなたの場合、それは:

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年後、期待どおりに動作しているように見えます。round()は時間とともに進化したようです。以下を参照:ラウンド(1.379、2)-> 1.38ラウンド(1.372、2)-> 1.37ラウンド(
1.375、2

82

使い方str.format()構文をするディスプレイ answer(の根底にある値を変更することなく2つの小数点以下の桁数でanswer):

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

どこ:


3
これは最も有用な回答ですIMO-実際の値をそのまま維持し、実装は簡単です!ありがとう!
BrettJ 2017

理由は不明ですが、 '{:0.2f}'。format(0.5357706)は '0.54'(python 3.6)を提供します
Noam Peled

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になると予想していました。
Janothan

(Pythonバージョン:3.6.10)
Janothan

48

ほとんどの回答が提案roundまたはformatround場合によっては切り上げられ、私の場合、変数のを切り捨てて表示するだけでなく、切り捨てる必要がありました。

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 2017

2
「値は、10の累乗からn桁を引いた最も近い倍数に丸められます。」docs.python.org/3/library/functions.html#round so no、roundは必ずしも切り上げられるわけではありません。例:round(2.354, 2) # -> 2.35
Pete Kirkham

@PeteKirkhamあなたは正しい、私は私の答えをより意味があり正確にするために編集した。
s4w3d0ff 2018年

2
-0.54は負の数値であるため、-0.5357706を切り捨てる場合の正解です。
0.54

2
10**d代わりに使用しますint('1' + ('0' * d))
Jonathon Reinhart


8

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

round(value,significantDigit)これを行うための通常の解決策ですが、四捨五入する桁のすぐ下(左側)の桁にaがある場合、これは数学の観点から期待されるように動作しないことがあります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とはこの回避策を適切に処理することができ進数の多くの適用範囲を変更しません。このアプローチは、値がタイプの制限に達した場合は失敗しますが、失敗しますが、有効な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()

...期待する結果が得られるはずです。

10進ライブラリーを使用してこれを実現することもできますが、私が提案するラッパーはより単純で、場合によっては優先される場合があります。


編集:フリンジケースがここで特定の値に対してのみ発生することを指摘してくれた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



3

ラウンド関数を使用できます。

round(80.23456, 3)

あなたに80.234の答えを与えます

あなたのケースでは、

answer = str(round(answer, 2))

お役に立てれば :)


2

浮動小数点の問題を回避する必要がある場合アカウンティングの数値を丸める際のを、numpy丸めを使用できます。

あなたは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}」。format(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、


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.