があり8.8333333333333339
、それをに変換したいとし8.84
ます。Pythonでこれをどのように達成できますか?
round(8.8333333333333339, 2)
与えません。私はPythonやプログラミング全般に不慣れです。8.83
8.84
文字列として出力したくないので、結果をさらに使用します。この問題の詳細については、Tim WilsonのPythonプログラミングのヒント:ローンと支払いの計算機を確認してください。
があり8.8333333333333339
、それをに変換したいとし8.84
ます。Pythonでこれをどのように達成できますか?
round(8.8333333333333339, 2)
与えません。私はPythonやプログラミング全般に不慣れです。8.83
8.84
文字列として出力したくないので、結果をさらに使用します。この問題の詳細については、Tim WilsonのPythonプログラミングのヒント:ローンと支払いの計算機を確認してください。
回答:
8.833333333339
(または8.833333333333334
、の結果106.00/12
)は、小数点以下2桁に適切に丸められます8.83
。数学的には、必要なのは天井関数のように聞こえます。Pythonのmath
モジュールにあるものの名前はceil
次のとおりです。
import math
v = 8.8333333333333339
print(math.ceil(v*100)/100) # -> 8.84
それぞれ、床関数と天井関数は通常、実数を小数点以下0桁の前後の最大の整数にマップします。したがって、小数点以下2桁に使用するには、最初に数値に10 2(または100)を掛けて小数点をシフトします。ポイントし、その後それで除算して補正します。
math
何らかの理由でモジュールを使用したくない場合は、私が書いたこの(最小限のテスト済み)実装を使用できます。
def ceiling(x):
n = int(x)
return n if n-1 < x <= n else n+1
サンプル出力から、彼らは毎月の支払いを切り上げたように見えます。これは多くの人が天井関数の効果と呼んでいます。この手段は、毎月少し超えることを1 / 12総量のが支払われています。そのため、最終的な支払いは通常より少し少なくなり、未払いの残高はわずかになりました8.76
。
通常の丸めを使用して、月々の支払い8.83
とわずかに高い最終的な支払いを生成することも同様に有効でした8.87
。ただし、現実の世界では、一般的に人々は支払いを増やすことを好まないため、各支払いを切り上げるのが一般的な方法です。また、より迅速に貸し手にお金を返します。
print
関数/ステートメントを使用する場合は違います(Pythonのバージョンによって異なります)。
>>> 106.00/12 => 8.833333333333334
はるかに簡単な方法は、単にround()関数を使用することです。これが例です。
total_price = float()
price_1 = 2.99
price_2 = 0.99
total_price = price_1 + price_2
今すぐtotal_priceを印刷すると、次のようになります。
3.9800000000000004
しかし、あなたがそれをそのようにround()関数で囲むならば
print(round(total_price,2))
出力は等しい
3.98
round()関数は、2つのパラメーターを受け入れることによって機能します。1つ目は、丸めたい数値です。2番目は、四捨五入する小数点以下の桁数です。
8.8333333333339を小数点以下2桁に四捨五入すると、正解は8.84ではなく8.83になります。8.83000000001を取得した理由は、8.83がバイナリで正しく表現できない数値であり、最も近い数値を提供するためです。すべてゼロなしで印刷する場合は、VGEの指示に従ってください。
print "%.2f" % 8.833333333339 #(Replace number with the variable?)
これを行う最も簡単な方法は、組み込みの以下の関数を使用することです。
format()
例えば:
format(1.242563,".2f")
出力は次のようになります。
1.24
同様に:
format(9.165654,".1f")
与えるだろう:
9.2
丸めたい場合は、8.84が不正解です。8.833333333333の四捨五入は8.84ではなく8.83です。常に切り上げたい場合は、math.ceilを使用できます。浮動小数点数自体を丸めても意味がないため、両方を文字列フォーマットと組み合わせて実行します。
"%.2f" % (math.ceil(x * 100) / 100)
これが切り上げ/切り下げ問題の私の解決策です
< .5 round down
> = .5 round up
import math
def _should_round_down(val: float):
if val < 0:
return ((val * -1) % 1) < 0.5
return (val % 1) < 0.5
def _round(val: float, ndigits=0):
if ndigits > 0:
val *= 10 ** (ndigits - 1)
is_positive = val > 0
tmp_val = val
if not is_positive:
tmp_val *= -1
rounded_value = math.floor(tmp_val) if _should_round_down(val) else math.ceil(tmp_val)
if not is_positive:
rounded_value *= -1
if ndigits > 0:
rounded_value /= 10 ** (ndigits - 1)
return rounded_value
# test
# nr = 12.2548
# for digit in range(0, 4):
# print("{} decimals : {} -> {}".format(digit, nr, _round(nr, digit)))
# output
# 0 decimals : 12.2548 -> 12
# 1 decimals : 12.2548 -> 12.0
# 2 decimals : 12.2548 -> 12.3
# 3 decimals : 12.2548 -> 12.25
decimal
モジュールを使用します:http://docs.python.org/library/decimal.html
َََّّّ
これを行うための簡単な関数は次のとおりです。
def precision(num,x):
return "{0:.xf}".format(round(num))
ここで、numは10進数です。xは、浮動小数点数を四捨五入するまでの小数です。
他の実装に対する利点は、小数点以下x桁までの小数点以下の桁数を作成するために、小数点の右端のゼロを埋めることができることです。
例1:
precision(10.2, 9)
戻ります
10.200000000(小数点以下9桁まで)
例2:
precision(10.2231, 2)
戻ります
10.22(小数点以下2桁まで)