あなたはあなたの答えを丸めたいです。
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