الحفاظ على نفس التنسيق النقطة العائمة القيم
-
03-07-2019 - |
سؤال
لدي برنامج بيثون أن يقرأ النقطة العائمة القيم باستخدام التعبير العادي التالي
(-?\d+\.\d+)
بمجرد استخراج القيمة باستخدام تعويم(المباراة.المجموعة(1)) ، أحصل على الفعلية النقطة العائمة عدد.ومع ذلك أنا لست قادرا على التمييز إذا كان عدد 1.2345678 أو 1.234 أو 1.2340000.
المشكلة أواجهها لطباعة قيمة النقطة العائمة مرة أخرى مع نفس التنسيق.حل سهل هو "تقسيم العد" قيمة النقطة العائمة عندما لا تزال سلسلة ، على سبيل المثال تقسيم في العشرية و عد جزء صحيح من طول الجزء الكسري طول ، ثم إنشاء المنسق كما
print "%"+str(total_len)+"."+str(fractional_len)+"f" % value
ولكن ربما كنت أعرف طريقة قياسية لتحقيق نفس النتيجة ؟
المحلول
هل الطريقة صحيحة في الأساس.سلسلة التنسيق لديها أقل في كثير من الأحيان تستخدم *
المشغل يمكنك وضع على التنسيق الأحجام ، وإليك بعض التعليمات البرمجية:
import re
def parse_float(str):
re_float = re.compile(r'(-?)(\d+)\.(\d+)')
grps = re_float.search(str)
sign, decimal, fraction = grps.groups()
float_val = float('%s%s.%s' % (sign, decimal, fraction))
total_len = len(grps.group(0))
print '%*.*f' % (total_len, len(fraction), float_val)
parse_float('1.2345678')
parse_float('1.234')
parse_float('1.2340000')
وإخراج
1.2345678
1.234
1.2340000
نصائح أخرى
إذا كنت ترغب في الحفاظ على الدقة ثابتة ، تجنب استخدام float
s واستخدام Decimal
بدلا من ذلك:
>>> from decimal import Decimal
>>> d = Decimal('-1.2345')
>>> str(d)
'-1.2345'
>>> float(d)
-1.2344999999999999
>>> from decimal import Decimal as d
>>> d('1.13200000')
Decimal('1.13200000')
>>> print d('1.13200000')
1.13200000