このコード(華氏から摂氏への変換プログラム)の出力には、小数部がたくさんあります。
私のコードは現在このように見えます:
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位にすべての答えを丸めるのですか?
str.format()
の 構文 to display answer
を小数点以下2桁で使用します(answer
の基礎となる値を変更することなく)
def printC(answer):
print "\nYour Celsius value is {:0.2f}ºC.\n".format(answer)
どこで:
:
は フォーマット仕様を導入します0
は数値型の符号を意識したゼロ詰めを可能にします.2
は、 precision を2
に設定します。f
は、数値を固定小数点数として表示します質問には「四捨五入する方法下を小数点以下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
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))
%.2fのフォーマットを使用するだけで、小数点以下2桁に切り捨てられます。
def printC(answer):
print "\nYour Celsius value is %.2f C.\n" % answer
あなたは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
あなたはあなたの答えを丸めたいです。
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
は、X
にround
を加えて、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 ライブラリを使うこともできますが、私が提案するラッパーはもっと単純で、場合によっては好まれるかもしれません。
round 演算子は2桁までの10進数で使用できます
num = round(343.5544, 2)
print(num) // output is 343.55
これが私が使った例です:
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)
理由はよくわかりませんが、 '{: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
Round関数を使うことができます。
round(80.23456, 3)
あなたに80.234の答えを与えるでしょう
あなたの場合は、
answer = str(round(answer, 2))
お役に立てれば :)
回答を10進数で表示したいので、printC()関数で answer 変数をstrに型キャストする必要はありません。
round(12.3956 - 0.005, 2) # minus 0.005, then round.