7

より正確に取得したいのです1/7が、切り捨てられました。有理数を変換するときに、どうすれば精度を上げることができますか?

>>> str(1.0/7)[:50]
'0.142857142857'
4

4 に答える 4

9

Pythonには、任意精度の計算用の組み込みライブラリであるDecimalがあります。例えば:

>>>from decimal import Decimal, getcontext
>>>getcontext().prec = 50
>>>x = Decimal(1)/Decimal(7)
>>>x
Decimal('0.14285714285714285714285714285714285714285714285714')
>>>str(x)
'0.14285714285714285714285714285714285714285714285714'

詳細については、PythonDecimalのドキュメントを参照してください。精度は必要なだけ高く変更できます。

于 2009-11-12T04:34:44.407 に答える
6

分子に大きな10^Nを掛けて、任意精度の整数を使用することができます。

編集

つまり:

> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L

Pythonの整数は任意精度です。Pythonのfloatは決して任意精度ではありません。(別の回答が指摘しているように、Decimalを使用する必要があります)

于 2009-11-12T04:04:13.067 に答える
3

Perlの使用(Pythonを記述できないため;-):

use strict; use warnings;

use integer;

my $x = 1;
my $y = 7;

for (1 .. 50) {
    $x *= 10 if $x < $y;
    my $q = $x / $y;
    $x -= $q * $y;
    print $q;
}

print "\n";
14285714285714285714285714285714285714285714285714

手で確認できるように、数字が繰り返されます。を使用して印刷すると、より正確な錯覚"%.50f"が得られます。

于 2009-11-12T04:08:13.900 に答える
2

gmpy

>>> import gmpy
>>> thefraction = gmpy.mpq(1, 7)
>>> hiprecfloat = gmpy.mpf(thefraction, 256)
>>> hiprecfloat.digits(10, 50, -10, 10)
'0.14285714285714285714285714285714285714285714285714'
>>> 

通常のフロートではそれを行うことはできません-それらは50桁の十分な精度を持っていないだけです!で(2.6以降で)それを行う方法があると思いますがfractions.Fraction、それ以外の方法でフォーマットする方法には慣れていませ'1/7'ん(あなたの場合はあまり役に立ちません!-)。

于 2009-11-12T04:10:08.110 に答える