it-swarm.dev

التقريب إلى منزلتين عشريتين في Python 2.7؟

باستخدام Python 2.7 كيف يمكنني تقريب أرقامي إلى منزلتين عشريتين بدلاً من 10 أو نحو ذلك؟

print "financial return of outcome 1 =","$"+str(out1)
78
RCN

استخدم الوظيفة المدمجة round() :

>>> round(1.2345,2)
1.23
>>> round(1.5145,2)
1.51
>>> round(1.679,2)
1.68

أو وظيفة مدمجة format() :

>>> format(1.2345, '.2f')
'1.23'
>>> format(1.679, '.2f')
'1.68'

أو تنسيق سلسلة نمط جديد:

>>> "{:.2f}".format(1.2345)
'1.23
>>> "{:.2f}".format(1.679)
'1.68'

أو تنسيق سلسلة النمط القديم:

>>> "%.2f" % (1.679)
'1.68'

مساعدة في round:

>>> print round.__doc__
round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number.  Precision may be negative.
187
Ashwini Chaudhary

بما أنك تتحدث عن مالية أرقام ، فأنت لا تريد لاستخدام حساب الفاصلة العائمة. أنت أفضل حالا باستخدام العشرية.

>>> from decimal import Decimal
>>> Decimal("33.505")
Decimal('33.505')

تنسيق إخراج النص بنمط format() الجديد (الافتراضات الافتراضية لتقريب النصف):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505")))
financial return of outcome 1 = 33.50
>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515")))
financial return of outcome 1 = 33.52

راجع الاختلافات في التقريب بسبب عدم دقة الفاصلة العائمة:

>>> round(33.505, 2)
33.51
>>> round(Decimal("33.505"), 2)  # This converts back to float (wrong)
33.51
>>> Decimal(33.505)  # Don't init Decimal from floating-point
Decimal('33.50500000000000255795384873636066913604736328125')

طريقة مناسبة لتقريب القيم المالية :

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default
Decimal('33.50')

من الشائع أيضًا وجود أنواع أخرى من التقريب في معاملات مختلفة:

>>> import decimal
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN)
Decimal('33.50')
>>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP)
Decimal('33.51')

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

42
Ronan Paixão

يمكنك استخدام str.format() ، أيضًا:

>>> print "financial return of outcome 1 = {:.2f}".format(1.23456)
financial return of outcome 1 = 1.23
5
TerryA

عند العمل مع البنسات/الأعداد الصحيحة. سوف تواجه مشكلة مع 115 (كما هو الحال في 1.15 دولار) وأرقام أخرى.

كان لدي وظيفة من شأنها تحويل عدد صحيح إلى تعويم.

...
return float(115 * 0.01)

لقد نجح ذلك معظم الوقت ، ولكنه في بعض الأحيان سيعود بشيء مثل 1.1500000000000001.

لذلك قمت بتغيير وظيفتي للعودة مثل هذا ...

...
return float(format(115 * 0.01, '.2f'))

وهذا سيعود 1.15. ليس '1.15' أو 1.1500000000000001 (إرجاع تعويم وليس سلسلة)

أنا في الغالب نشر هذا حتى أتمكن من تذكر ما فعلت في هذا السيناريو لأن هذه هي النتيجة الأولى في جوجل.

4
teewuane

عندما نستخدم الدالة round () ، لن تعطي القيم الصحيحة.

يمكنك التحقق من ذلك باستخدام ، الجولة (2.735) وجولة (2.725)

يرجى استخدام

import math
num = input('Enter a number')
print(math.ceil(num*100)/100)
2
Midhun M M

الأفضل ، في اعتقادي ، هو استخدام format () function:

>>> print("financial return of outcome 1 = $ " + format(str(out1), '.2f'))
// Should print: financial return of outcome 1 = $ 752.60

ولكن يجب أن أقول: لا تستخدم تقريبًا أو تنسيقًا عند التعامل مع القيم المالية.

2
Thiago Santos
print "financial return of outcome 1 = $%.2f" % (out1)
1
John Doe

عند التقريب إلى 0.05 التالي ، أود القيام بهذه الطريقة:

def roundup(x):
    return round(int(math.ceil(x / 0.05)) * 0.05,2)
0
Lucas VL

الحل البسيط إلى حد ما هو تحويل الطفو إلى سلسلة أولاً ، واختيار سلسلة فرعية من الأرقام الأربعة الأولى ، وأخيراً تحويل السلسلة الفرعية إلى طفو. فمثلا:

>>> out1 = 1.2345
>>> out1 = float(str(out1)[0:4])
>>> out1

قد لا تكون فائقة الكفاءة ولكن بسيطة ويعمل :)

0
Shan Niz