より正確に取得したいのです1/7
が、切り捨てられました。有理数を変換するときに、どうすれば精度を上げることができますか?
>>> str(1.0/7)[:50]
'0.142857142857'
より正確に取得したいのです1/7
が、切り捨てられました。有理数を変換するときに、どうすれば精度を上げることができますか?
>>> str(1.0/7)[:50]
'0.142857142857'
Pythonには、任意精度の計算用の組み込みライブラリであるDecimalがあります。例えば:
>>>from decimal import Decimal, getcontext
>>>getcontext().prec = 50
>>>x = Decimal(1)/Decimal(7)
>>>x
Decimal('0.14285714285714285714285714285714285714285714285714')
>>>str(x)
'0.14285714285714285714285714285714285714285714285714'
詳細については、PythonDecimalのドキュメントを参照してください。精度は必要なだけ高く変更できます。
分子に大きな10^Nを掛けて、任意精度の整数を使用することができます。
編集
つまり:
> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L
Pythonの整数は任意精度です。Pythonのfloatは決して任意精度ではありません。(別の回答が指摘しているように、Decimalを使用する必要があります)
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"
が得られます。
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'
ん(あなたの場合はあまり役に立ちません!-)。