3

目的の値を取得するのに問題があります。

次の「abc」文字列は角度を表します。「結果」文字列は、探している値を表します。

a = '199.1224'
result = '199.122400000000000'

b = '199.0362'
result = '199.036200000000010'

c = '-199.9591'
result = '-199.959100000000010'

次のコードを使用します。

Decimal(float(a)).quantize(Decimal('.000000000000001'), rounding=ROUND_HALF_UP)

results in 
a = 199.122399999999999
b = 199.036200000000008
c = -199.959100000000007

私は数学の天才ではなく、Decimal モジュールで可能な限りのことを試しましたが、必要な結果を得るための正しい方法が見つからないようです。

私が使用するくだらない回避策として:

Decimal(float(a)).quantize(Decimal('.00000000000001'), rounding=ROUND_HALF_UP)
str(a)+'0'

したがって、10進数を1つ減らして量子化し、文字列に変換して(とにかくそれを行う必要があります)、ゼロを追加します。これにより、何千ものこれらの値で正しい望ましい結果が得られます。しかし、丸めてゼロで終わる正しい方法があるかどうかを知りたいです(これの英語の単語がわかりません)。

4

2 に答える 2

0

使い方に問題があると思いますfloat(a)。float 型には、ほとんどの終了小数の正確な表現がありません。私が使用した:

from decimal import *
b = '199.0362'
Decimal(float(b)).quantize(Decimal('.000000000000001'), rounding=ROUND_HALF_UP)
Decimal(b).quantize(Decimal('.000000000000001'), rounding=ROUND_HALF_UP)

Decimal('199.036200000000008')最初のものと同じように取得しますがDecimal('199.036200000000000')、2番目のものです。では、float() 変換は、2 番目のバージョンだけを使用することはできません。

計算された浮動小数点の結果から入力を取得する必要がある場合は、有効桁数が約 52 ビット、または約 52*log10(2) ~~ 15.6 桁しか得られないことに注意してください。そのため、有効数字の 16 桁目が正しく丸められていない可能性があります。通常、実際には 15 と見なされます。format 関数を使用すると、丸められた結果を文字列で取得できます。

format(float(b), ".15g")

これにより、末尾の小数ゼロが抑制され、より便利な場合は科学表記法に切り替わります。ただし、結果は有効数字 15 桁に丸められます。その結果を目的の固定小数点以下桁数にフォーマットする必要がある場合があります。

d = Decimal(float(b), ".15g")
print ("d = " + format(d, ".12f"))
于 2013-08-26T15:30:43.393 に答える
-1
import decimal
from decimal import Decimal

b = '199.0362'
result = Decimal(float(b)).quantize(Decimal('0e-14'), rounding=decimal.ROUND_HALF_UP)
print format(result, '.15f')

# a:  '199.1224' ->  '199.122400000000000'
# b:  '199.0362' ->  '199.036200000000010'
# c: '-199.9591' -> '-199.959100000000010'
  • in'0e-14'の代わりにを使用すると、桁数を数えて正しいことを確認する必要はありません。'0.00000000000001'quantize
  • 関数を使用formatして、特定の小数点以下の桁数の文字列に変換します。
于 2013-08-27T13:15:34.437 に答える