ভাসমান মান মুদ্রণ করার সময় কীভাবে বৈজ্ঞানিক স্বরলিপি দমন করবেন?


147

আমার কোডটি এখানে:

x = 1.0
y = 100000.0    
print x/y

আমার ভাগফল হিসাবে প্রদর্শিত হয় 1.00000e-05

বৈজ্ঞানিক স্বরলিপি দমন করার এবং এটিকে প্রদর্শন করার মতো কোনও উপায় আছে কি 0.00001? আমি ফলাফলটি স্ট্রিং হিসাবে ব্যবহার করতে যাচ্ছি।



অ্যাসাইনমেন্ট স্টেটমেন্টে @AA, এটি ধরে নিয়েছে যে আমি এটি সংশোধন করেছি।
দানা

হতাশাজনক যে এখানে কোনও উত্তরই প্রশ্নের উত্তর দেয় না। স্পষ্টভাবে নির্দিষ্ট করা ব্যতীত পাইথনকে (3) বৈজ্ঞানিক স্বরলিপি ব্যবহার করা থেকে বিরত করার কোনও উপায় থাকলে ভাল লাগবে। সমস্ত উত্তরগুলির জন্য ব্যবহারকারীকে বৈজ্ঞানিক স্বরলিপিটি স্পষ্টভাবে দমন করতে হবে, যা পাইথনের অভ্যন্তর থেকে বৈজ্ঞানিক স্বরলিপিটির অন্তর্নিহিত ব্যবহারকে দমন করার মতো নয়।
বিএলইউসি

উত্তর:


64
'%f' % (x/y)

তবে আপনার নিজের যথার্থতা পরিচালনা করতে হবে। যেমন,

'%f' % (1/10**8)

কেবল শূন্য প্রদর্শন করবে।
বিশদটি ডক্সে রয়েছে

অথবা পাইথন 3 এর জন্য সমান পুরানো ফর্ম্যাটিং বা আরও নতুন স্টাইল বিন্যাস


7
আমি আপনার বক্তব্যকে স্পষ্ট করে বলতে বলি, "আপনি নিজেকে নির্ভুলতার প্রদর্শন পরিচালনা করেন ।" প্রকৃত (পাইথন অভ্যন্তরীণ) যথার্থতা পরিবর্তন হয় নি, যেমনটি প্রায়শই অন্যান্য ভাষায় করা হয়।
জেএস।

92

নতুন সংস্করণ ব্যবহার করে ''.format( .আপনি প্রদর্শন করতে ইচ্ছুক হওয়ার পরে কতগুলি সংখ্যা নির্দিষ্ট করতে হবে তা ভাসমান সংখ্যাটি কতটা ছোট তার উপর নির্ভর করে)। এই উদাহরণটি দেখুন:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

উপরে প্রদর্শিত হিসাবে, ডিফল্ট 6 সংখ্যা! এটি আমাদের ক্ষেত্রে উদাহরণের জন্য সহায়ক নয়, পরিবর্তে আমরা এর মতো কিছু ব্যবহার করতে পারি:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

হালনাগাদ

পাইথন ৩.6 থেকে শুরু করে, এটি নতুন ফর্ম্যাট স্ট্রিং আক্ষরিক সাহায্যে সহজ করা যেতে পারে :

>>> f'{a:.20f}'
'-0.00000000000000007186'

যদিও উল্লেখযোগ্য পরিসংখ্যান উল্লেখ করার সময় এটি কীভাবে করবেন?
মঙ্গল 11

আমি একটি ভেরিয়েবল ব্যবহার করে অনুমান করি যে এটিকে অঙ্কের পছন্দসই সংখ্যাটি দিন এবং আক্ষরিক সংখ্যার পরিবর্তে এটি ব্যবহার করুন যেমনf"{a:.{precision}f}"
আজিজ আল্টো

49

পাইথনের নতুন সংস্করণগুলি (২.6 এবং তার পরে) এর সাথে, আপনি ''.format()@ সিলেন্টগোস্টের পরামর্শ অনুসারে কাজটি করতে পারেন :

'{0:f}'.format(x/y)

1
এই কি আপনি চান সত্যিই? আমি করি না: >>> print('{:f}'.format(0.000000123)) 0.000000
দ্বৈততা

1
@ দ্বৈততা আপনার নির্ভুলতা নির্দিষ্ট করতে পারে। '{0:.10f}'
এনমিকহেলস

24

আরেকটি বিকল্প, আপনি যদি পান্ডা ব্যবহার করছেন এবং সমস্ত ভাসমানের জন্য বৈজ্ঞানিক স্বরলিপি দমন করতে চান তবে হ'ল পান্ডাস বিকল্পগুলি সমন্বয় করা।

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

10

উপরের বেশিরভাগ উত্তরের জন্য আপনাকে নির্ভুলতা নির্দিষ্ট করতে হবে। তবে আপনি যদি অকারণে শূন্য ছাড়াই এভাবে ভাসমান প্রদর্শন করতে চান তবে:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy একটি উত্তর আছে: np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')

5

এটি যে কোনও ঘেরের জন্য কাজ করবে:

def getExpandedScientificNotation(flt):
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    return return_val

4

এটি ক্যাপ্টেন শসাবার উত্তরটি ব্যবহার করছে তবে 2 টি সংযোজন রয়েছে।

1) ফাংশনটি অ বৈজ্ঞানিক স্বরলিপি নম্বর পেতে দেয় এবং কেবল সেগুলি হিসাবে তাদের ফিরিয়ে দেয় (যাতে আপনি প্রচুর ইনপুট ফেলতে পারেন যে কয়েকটি সংখ্যা 0.00003123 বনাম 3.123e-05 এবং এখনও ফাংশনটির কাজ রয়েছে।

2) নেতিবাচক সংখ্যার জন্য সমর্থন যুক্ত। (মূল ফাংশনে, একটি নেতিবাচক সংখ্যা -1.08904e-05 থেকে 0.0000-108904 এর মতো শেষ হবে)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val

3

এসজির উত্তর ছাড়াও, আপনি দশমিক মডিউলটিও ব্যবহার করতে পারেন:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'

14
এটি 1e-6 এর চেয়ে কম মানের জন্য বৈজ্ঞানিক স্বরলিপিতে পরিণত হয়
সাইলেন্টগোস্ট

2

যদি এটি হয় তবে এটির জন্য stringঅন্তর্নির্মিতটি floatরূপান্তর করতে উদাহরণস্বরূপ ব্যবহার করুন: print( "%.5f" % float("1.43572e-03")) উত্তর:0.00143572


1

যেহেতু গুগলে এটি শীর্ষ ফলাফল, আমি আমার সমস্যার সমাধান পেতে ব্যর্থ হয়ে এখানে পোস্ট করব। যদি আপনি কোনও ফ্লোট অবজেক্টের ডিসপ্লের মানটি ফর্ম্যাট করতে চান এবং এটি একটি ফ্ল্যাট থেকে থাকে - স্ট্রিং নয়, আপনি এই সমাধানটি ব্যবহার করতে পারেন:

একটি নতুন শ্রেণি তৈরি করুন যা ভাসমান মানগুলি প্রদর্শিত হয় সেভাবে পরিবর্তন করে।

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

আপনি পূর্ণসংখ্যার মানগুলিতে পরিবর্তন করে যথাযথ পরিবর্তন করতে পারেন {:f}


-1

৩..4.৪ ব্যবহার করে আমারও একই সমস্যা ছিল যে এলোমেলোভাবে, আউটপুট ফাইলের একটি নম্বর এটি ব্যবহার করার সময় বৈজ্ঞানিক স্বরলিপি দিয়ে ফর্ম্যাট করা হবে:

fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))

এটি ঠিক করতে আমাকে যা করতে হয়েছিল তা হ'ল 'চ' যুক্ত করা:

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))

-1

৩.6 হিসাবে (সম্ভবত কিছুটা পুরানো ৩.x এর সাথেও কাজ করে), এটি আমার সমাধান:

import locale
locale.setlocale(locale.LC_ALL, '')

def number_format(n, dec_precision=4):
    precision = len(str(round(n))) + dec_precision
    return format(float(n), f'.{precision}n')

precisionগণনার উদ্দেশ্য হ'ল বৈজ্ঞানিক স্বরলিপি থেকে দূরে রাখতে আমাদের পর্যাপ্ত নির্ভুলতা রয়েছে তা নিশ্চিত করা (ডিফল্ট নির্ভুলতা এখনও 6))

dec_precisionযুক্তি দশমিক বিন্দুর জন্য ব্যবহার করতে অতিরিক্ত স্পষ্টতা যোগ করা হয়েছে। যেহেতু এটি nফর্ম্যাটটি ব্যবহার করে, তাই কোনও তুচ্ছ শূন্য যুক্ত করা হবে না ( fফর্ম্যাটগুলির বিপরীতে )। nদশমিক ছাড়াই ইতিমধ্যে রাউন্ড পূর্ণসংখ্যার রেন্ডারিংয়ের যত্ন নেবে।

nfloatইনপুট প্রয়োজন , সুতরাং theালাই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.