سؤال

لذا قررت لمحاولة حل الواجبات المنزلية الفيزياء من خلال كتابة بعض البرامج النصية بيثون لحل المشاكل بالنسبة لي.مشكلة واحدة أن أنا على التوالي إلى أن شخصيات كبيرة لا يبدو دائما أن يخرج بشكل صحيح.على سبيل المثال هذا مقابض كبيرة الأرقام بشكل صحيح:

from decimal import Decimal
>>> Decimal('1.0') + Decimal('2.0')
Decimal("3.0")

ولكن هذا لا:

>>> Decimal('1.00') / Decimal('3.00')
Decimal("0.3333333333333333333333333333")

حتى سؤالين:

  1. أنا صحيح أن هذا ليس المبلغ المتوقع من ارقام كبيرة, أو هل أنا بحاجة إلى فرشاة على رقم كبير من الرياضيات ؟
  2. هل هناك أي طريقة للقيام بذلك دون الحاجة إلى تعيين الدقة العشرية يدويا ؟ أنا متأكد من أنني يمكن استخدام numpy للقيام بذلك ، ولكن أريد فقط أن أعرف إذا كان هناك طريقة للقيام بذلك مع العشرية وحدة من باب الفضول.
هل كانت مفيدة؟

المحلول

تغيير عشري العامل الدقة 2 أرقام لا فكرة جيدة, إلا إذا كنت على الاطلاق فقط تسير على أداء عملية واحدة.

يجب دائما إجراء العمليات الحسابية في الدقة أعلى من مستوى الدلالة فقط جولة النتيجة النهائية.إذا قمت بإجراء سلسلة طويلة من العمليات الحسابية و جولة إلى عدد من ارقام كبيرة في كل خطوة الأخطاء تتراكم.العشرية وحدة لا أعرف ما إذا كان أي عملية معينة هي واحدة في سلسلة طويلة ، أو النتيجة النهائية ، لذلك يفترض أنه لا ينبغي أن جولة أكثر من اللازم.والأفضل هو استخدام متناهية ، ولكن هذا مكلف جدا لذلك الثعبان المطورين استقر 28 أرقام.

مرة واحدة كنت قد وصلت في النتيجة النهائية ، ما ربما كنت تريد وتثبيتها:

>>> (Decimal('1.00') / Decimal('3.00')).quantize(Decimal("0.001"))
Decimal("0.333")

عليك أن تتبع أهمية يدويا.إذا كنت تريد التلقائي أهمية تتبع ، يجب استخدام فاصل الحساب.هناك بعض المكتبات المتاحة على الثعبان ، بما في ذلك pyinterval و mpmath (التي تدعم الدقة التعسفي).فمن أيضا واضحة لتنفيذ الفاصل الحساب مع عشري مكتبة, لأنه يدعم توجه التقريب.

قد تحتاج أيضا إلى قراءة عشري الحساب التعليمات:هو عشري الحساب 'أهمية' الحساب ؟

نصائح أخرى

العشرية لن نرمي عشرية مثل ذلك.إذا كنت حقا تريد أن تحد من الدقة إلى 2 د.p.ثم حاول

decimal.getcontext().prec=2

تحرير:يمكنك استدعاء بدلا من ثبت قيمة() في كل مرة كنت ضرب أو تقسيم (الجمع والطرح من شأنها الحفاظ على 2 dps).

من باب الفضول فقط...هل من الضروري استخدام العشرية الوحدة ؟ لماذا لا نقطة عائمة كبيرة-الأرقام التقريب من الأرقام عندما كنت على استعداد أن تراهم ؟ أو تحاول أن تتبع شخصيات كبيرة من حساب (مثل عندما يكون لديك للقيام خطأ تحليل نتيجة ، وحساب محسوب خطأ بوصفها وظيفة من الشكوك التي دخلت في حساب)?إذا كنت ترغب في التقريب وظيفة جولات من اليسار من رقم بدلا من الحق ، في محاولة:

def lround(x,leadingDigits=0): 
    """Return x either as 'print' would show it (the default) 
    or rounded to the specified digit as counted from the leftmost 
    non-zero digit of the number, e.g. lround(0.00326,2) --> 0.0033
    """ 
    assert leadingDigits>=0 
    if leadingDigits==0: 
            return float(str(x)) #just give it back like 'print' would give it
    return float('%.*e' % (int(leadingDigits),x)) #give it back as rounded by the %e format  

الأرقام تبدو حق عند طباعتها أو تحويلها إلى سلاسل, ولكن إذا كنت تعمل في موجه و لا صراحة طباعتها من أنها قد تبدو غريبة بعض الشيء:

>>> lround(1./3.,2),str(lround(1./3.,2)),str(lround(1./3.,4))
(0.33000000000000002, '0.33', '0.3333')

عشري التخلف إلى 28 الأماكن من الدقة.
الطريقة الوحيدة للحد من عدد من الأرقام فإنه يعود هو عن طريق تغيير الدقة.

إذا كنت تفهم العشرية بشكل صحيح ، "الدقة" هو عدد الأرقام بعد الفاصلة العشرية في عشري.

يبدو أنك تريد شيئا آخر:عدد ارقام كبيرة.هذا هو واحد أكثر من عدد الأرقام بعد الفاصلة العشرية في العلمي.

وأود أن تكون مهتمة في التعلم عن بيثون وحدة لا يستهان-أرقام-علم النقطة العائمة نقطة الحسابية.

ما هو الخطأ مع العائمة نقطة ؟

>>> "%8.2e"%  ( 1.0/3.0 )
'3.33e-01'

تم تصميمه العلمية على غرار الحسابات مع عدد محدود من ارقام كبيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top