web-dev-qa-db-ja.com

Python)の10進値を切り捨てます

Pythonで10進値を切り捨てようとしています。四捨五入したくないのですが、指定した精度まで小数値を表示するだけです。私は以下を試しました:

_d = 0.989434
'{:.{prec}f}'.format(d, prec=2)
_

これにより、0.99に丸められます。しかし、実際には出力を0.98にしたいです。明らかに、round()はオプションではありません。これを行う方法はありますか?または、コードに戻ってすべてをdecimalに変更する必要がありますか?

ありがとう。

15
visakh

私はあなたのすべての要件を認識していませんが、これはかなり堅牢になります。

>> before_dec, after_dec = str(d).split('.')
>> float('.'.join((before_dec, after_dec[0:2])))
0.98

2018-01-03編集

この答えは堅牢でも数学的にも正しくありません。 Decimal.quantizeメソッドを使用してこれを行う正しい方法については、 以下のNilani Algiriyageの回答 を参照してください。

8
Derek Litz

次のコードを使用できます

import decimal
d = 0.989434

print decimal.Decimal(d).quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
12
d = 0.989434
print floor(d * 100) / 100

Math.floor(x)xのフロアをfloatとして返します。これは、x以下の最大の整数値です。

小数「。」の左側にある2つの小数を移動し、フローリングしてから、「。」の右側にある数字を戻します。

100はによって変更することができます

n = 2
m = pow (10, n)
d = 0.989434
print floor(d * m) / m

nは必要な精度です。

EDIT: dが負の場合、ceilメソッドを使用する必要があります

if d < 0:
    print ceil(d * m) / m
else:
    print floor(d * m) / m
4
Marcassin

それをもっと長いものにフォーマットしてから、余分な数字を切り取ります。

def truncate(f, digits):
    return ("{:.30f}".format(f))[:-30+digits]
3
RemcoGerlich

これが私が信じる最良の方法です。

  1. 有効数字を左に移動します
  2. 小数部分を切り捨てます
  3. 移動した桁数を左、右に移動します

    d = 0.989434
    print "{0:0.2f}".format(int(d * 100)/100.0)
    

    出力

    0.98
    
3
thefourtheye

他のいくつかの回答とかなり似ていますが、インポートはありません

def truncate(x, d):
    return int(x*(10.0**d))/(10.0**d)

>>>truncate(0.987654, 2)
0.98
2
Kraay89
import math

d = 0.989434
prec = 2
output = math.floor(d * (10 ** prec)) / (10 ** prec)

それでも文字列の代わりに10進変数が必要な場合

2
Ray

数学でも:

d = 0.989434
x = int(d * 100.0) / 100.0
print "{0:0.2f}".format(x)
1
James Mills

この場合、以下のコードは0.98を出力しますが、d値が10以上にならないように注意する必要があります。そうすると、たとえば10.12ではなく10.1のみが出力されます。

d = 0.989434
print '{:.{prec}s}'.format(str(d), prec=4)
1
Ffisegydd

strを使用:

d = str(0.989434)
print float(d[:d.find('.')+3])
1
onionpsy

表示するだけでよい場合は、文字列に変換してスライスすることができます。

d = 0.989434
print str(d)[0:4] #or print(str(d)[0:4])
1
feydaykyn

このリンクで ここ 私は以下の解決策を投稿しました:

def truncate_number(f_number, n_decimals):
      strFormNum = "{0:." + str(n_decimals+5) + "f}"
      trunc_num = float(strFormNum.format(f_number)[:-5])
      return(trunc_num)

# Testing the 'trunc_num()' function
test_num = 1150/252
[(idx, truncate_number(test_num, idx)) for idx in range(0, 20)]

少なくとも、モジュールをロードする必要はなく、新しい計算も必要ありません。これまでのところ、公債価格の計算における切り捨て要件に関する私の問題は解決しました。

0
Eduardo Alvim