2009-11-12 26 views
7

मैं बेहतर परिशुद्धता के साथ 1/7 प्राप्त करना चाहता हूं, लेकिन इसे छोटा कर दिया गया। जब मैं तर्कसंगत संख्या को परिवर्तित करता हूं तो मैं बेहतर परिशुद्धता कैसे प्राप्त कर सकता हूं?यूलर # 26, बेहतर परिशुद्धता के साथ तर्कसंगत संख्या को स्ट्रिंग में कैसे परिवर्तित करें?

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

मुझे लगता है कि शायद वह समस्या 26 का मतलब है? http://projecteuler.net/index.php?section=problems&id=26 – Tenner

उत्तर

9

पायथन में मनमाने ढंग से सटीक गणनाओं के लिए अंतर्निहित लाइब्रेरी है: दशमलव। उदाहरण के लिए:

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

अधिक जानकारी के लिए Python Decimal documentation पर देखें। आप परिशुद्धता को जितना चाहें उतना ऊंचा कर सकते हैं।

+0

धन्यवाद। मुझे दशमलव मॉड्यूल के बारे में पता नहीं था। यह सबसे आसान तरीका है। – grokus

6

आप संख्यात्मक को 10^एन द्वारा गुणा कर सकते हैं और मनमानी-परिशुद्धता पूर्णांक के साथ चिपक सकते हैं।

संपादित

मेरा मतलब:

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

पायथन के पूर्णांक मनमाना परिशुद्धता कर रहे हैं। पायथन की फ्लोट कभी मनमानी परिशुद्धता नहीं होती है। (आप दशमलव उपयोग करने के लिए, के रूप में एक और उत्तर बताया गया होगा)

3

पर्ल का उपयोग करना (क्योंकि मैं अजगर ;-) नहीं लिख सकते हैं: आप हाथ से सत्यापित कर सकते हैं के रूप में

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" का उपयोग करके प्रिंटिंग आपको भ्रम अधिक सटीकता प्रदान करेगा।

+0

दरअसल, सभी तर्कसंगत संख्याएं अंततः दोहराती हैं। –

+0

यह सरल विधि वास्तव में काम करती है। मैं इसे पायथन में बदल दूंगा और इसका इस्तेमाल करूंगा। धन्यवाद। – grokus

+0

@ सिनन, मुझे अंकों को दोहराना पता है, लेकिन अन्य तर्कसंगत संख्याओं में दोहराने वाले पैटर्न का पता लगाने के लिए (1/डी जहां डी <1000), मुझे और अधिक सटीकता की आवश्यकता है। – grokus

2
gmpy साथ

:

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

आप सामान्य तैरता के साथ ऐसा नहीं कर सकते हैं - वे सिर्फ 50 अंक के लिए पर्याप्त सटीक नहीं है! मुझे लगता है कि इसे fractions.Fraction के साथ (2.6 या बेहतर में) करने का कोई तरीका है, लेकिन मैं '1/7' (आपके मामले में बहुत उपयोगी नहीं) के प्रारूप में इसे प्रारूपित करने के किसी भी तरीके से परिचित नहीं हूं।