كيف يمكنني إجبار الشعبة على أن تكون نقطة عائمة؟ الانقسام يبقى التقريب إلى 0؟

StackOverflow https://stackoverflow.com/questions/1267869

سؤال

لدي اثنين من القيم الصحيحة a و b, ، لكنني بحاجة إلى نسبةها في النقطة العائمة. وأنا أعلم ذلك a < b وأريد حساب a / b, ، لذلك إذا كنت أستخدم قسم عدد صحيح، سأحصل دائما على 0 مع ما تبقى من a.

كيف يمكنني القوة c أن تكون رقم نقطة عائمة في بيثون في ما يلي؟

c = a / b
هل كانت مفيدة؟

المحلول

في بيثون 2، تنتج تقسيم اثنين من دولتين int. في بيثون 3، فإنها تنتج تعويم. يمكننا الحصول على السلوك الجديد من خلال الاستيراد من __future__.

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

نصائح أخرى

يمكنك أن يلقي إلى تعويم من خلال القيام به c = a / float(b). وبعد إذا كان البسط أو قاسم تعويم، فستكون النتيجة أيضا.


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

كيف يمكنني إجبار الشعبة على أن تكون نقطة عائمة في بيثون؟

لدي قيمان عددا صحيحا A و B، لكنني بحاجة إلى نسبةها في النقطة العائمة. أعلم أن <b وأريد حساب A / B، لذلك إذا كنت أستخدم قسم عدد صحيح، سأحصل دائما على 0 مع ما تبقى من أ.

كيف يمكنني إجبار C لتكون رقم نقطة عائمة في بيثون في ما يلي؟

c = a / b

ما هو مطلوب حقا هنا هو:

"كيف أجبر الانقسام الحقيقي مثل ذلك a / b سوف تعيد الكسر؟ "

الترقية إلى بيثون 3

في بيثون 3، للحصول على التقسيم الحقيقي، أنت تفعل ببساطة a / b.

>>> 1/2
0.5

قسم الكلمة، سلوك الشعبة الكلاسيكية للأعداد الصحيحة، هو الآن a // b:

>>> 1//2
0
>>> 1//2.0
0.0

ومع ذلك، قد تكون عالقا باستخدام Python 2، أو قد تكتب التعليمات البرمجية التي يجب أن تعمل في كل من 2 و 3.

إذا كنت تستخدم بيثون 2

في بيثون 2، ليس بهذه البساطة. بعض الطرق للتعامل مع شعبة الكلاسيكية بيثون 2 هي أفضل وأكثر قوة من غيرها.

توصية لبثيون 2

يمكنك الحصول على سلوك قسم بايثون 3 في أي وحدة نمطية معينة مع الاستيراد التالي في الأعلى:

from __future__ import division

مما يطبق بعد ذلك قسم نمط بيثون 3 إلى الوحدة النمطية بأكملها. كما يعمل في قذيفة بيثون في أي نقطة معينة. في بيثون 2:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

هذا هو الحل الأفضل حقا لأنه يضمن رمز الوحدة النمطية الخاصة بك هو أكثر توافقا مع Python 3.

خيارات أخرى لبيتثون 2

إذا كنت لا ترغب في تطبيق هذا على الوحدة النمطية بأكملها، فأنت تقتصر على عدد قليل من الحلول. الأكثر شعبية هو إكراه واحدة من المعاملات إلى تعويم. حل قوي قوي هو a / (b * 1.0). وبعد في قذيفة بيثون جديدة:

>>> 1/(2 * 1.0)
0.5

أيضا قوي هو truediv من operator وحدة operator.truediv(a, b), ، ولكن هذا أمر أبطأ لأنه مكالمة وظيفة:

>>> from operator import truediv
>>> truediv(1, 2)
0.5

غير مستحسن لبثيون 2

شائز هو a / float(b). وبعد سيؤدي ذلك إلى رفع نوع إذا كان ب رقم معقد. نظرا لأن الانقسام مع أرقام معقدة يعرف، فمن المنطقي أن لا يكون لدي شعبة فشل عندما مرت رقم معقد للمقسمة.

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

لا معنى له كثيرا أن تجعل رمزك أكثر هشاشة.

يمكنك أيضا تشغيل بيثون مع -Qnew علم، ولكن هذا لديه الجانب السلبي لتنفيذ جميع الوحدات النمطية مع سلوك Python 3 الجديد، وبعض الوحدات الخاصة بك قد تتوقع التقسيم الكلاسيكي، لذلك لا أوصي بهذا باستثناء الاختبار. ولكن لإظهار:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
c = a / (b * 1.0)

في بيثون 3.x، مائل واحد (/) يعني دائما تقسيم صحيح (غير اقتطاع). (ال // يستخدم المشغل لقسم اقتطاع.) في Python 2.x (2.2 وما فوق)، يمكنك الحصول على هذا السلوك نفسه عن طريق وضع

from __future__ import division

في الجزء العلوي من الوحدة النمطية الخاصة بك.

فقط مما يجعل أي من المعلمات للقسمة في تنسيق النقطة العائمة ينتج أيضا الإخراج في النقطة العائمة.

مثال:

>>> 4.0/3
1.3333333333333333

أو،

>>> 4 / 3.0
1.3333333333333333

أو،

>>> 4 / float(3)
1.3333333333333333

أو،

>>> float(4) / 3
1.3333333333333333

إضافة نقطة (.) للإشارة إلى أرقام النقطة العائمة

>>> 4/3.
1.3333333333333333

هذا سوف يعمل أيضا

>>> u=1./5
>>> print u
0.2

إذا كنت ترغب في استخدام قسم "True" (النقطة العائمة) بشكل افتراضي، فهناك علامة سطر الأوامر:

python -Q new foo.py

هناك بعض العيوب (من PEP):

لقد جادل بأن خيار سطر الأوامر لتغيير الافتراضي هو الشر. يمكن أن يكون بالتأكيد خطيرا في الأيدي الخطأ: على سبيل المثال، سيكون من المستحيل الجمع بين حزمة مكتبة الطرف الثالث التي تتطلب -QNew مع واحد آخر يتطلب -Qold.

يمكنك معرفة المزيد حول قيم الأعلام الأخرى التي تتغير / تحذر حول سلوك التقسيم من خلال النظر إلى صفحة Python Man.

للحصول على تفاصيل كاملة حول التغييرات في التقسيم بيب 238 - تغيير مشغل الشعبة

from operator import truediv

c = truediv(a, b)
from operator import truediv

c = truediv(a, b)

حيث توزيع الأرباح و B مقسمي. هذه الوظيفة مفيدة عندما الحاصل بعد تقسيم اثنين من الأعداد الصحيحة هي تعويم.

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