কোনও ফ্লোটকে গোল করে না করে স্ট্রিতে রূপান্তর করা


88

আমি একটি প্রোগ্রাম তৈরি করছি যা কারণে ব্যাখ্যা করার প্রয়োজন নেই, লেন () দিয়ে গণনা করার জন্য একটি স্ট্রিতে রূপান্তরিত করার জন্য একটি ফ্লোট প্রয়োজন। তবে, স্ট্রিং (রূপান্তর) (এক্স) এর ফলে এক্স স্ট্রিংতে রূপান্তরিত হয় এবং পুরো জিনিসটি বন্ধ করে দেয় x কেউ কি এর ঠিক করার কথা জানেন? আপনি জানতে চাইলে কোডটি এখানে ব্যবহৃত হচ্ছে:

len(str(float(x)/3))

4
যদি x মূলত str হয় তবে theালাই কেন?
ভিনকো ভার্সালভিক

4
-1: এর বিভিন্ন মানের জন্য প্রয়োজনীয় ফলাফলের কোনও উদাহরণ নেই x। উদাহরণ ছাড়াই আমরা কেবল সমস্যাটি কী তা অনুমান করতে পারি।
এস .লট

উত্তর:


128

ভাসমান পয়েন্ট সংখ্যাগুলির সাথে লেনদেন করার সময় রাউন্ডিংয়ের কিছু ফর্ম প্রায়শই অনিবার্য। এটি কারণ যে সংখ্যাগুলি আপনি 10 বেসে ঠিক প্রকাশ করতে পারেন সেগুলি সবসময় বেস 2 তে প্রকাশ করা যায় না (যা আপনার কম্পিউটার ব্যবহার করে)।

উদাহরণ স্বরূপ:

>>> .1
0.10000000000000001

এই ক্ষেত্রে, আপনি .1 ব্যবহার করে স্ট্রিংয়ে রূপান্তরিত দেখছেন repr:

>>> repr(.1)
'0.10000000000000001'

আমি বিশ্বাস করি যে এই সমস্যাটি ঘটাতে আপনি যখন স্ট্র () ব্যবহার করেন তখন অজগরটি শেষ কয়েকটি অঙ্ক ছাড়িয়ে যায়, তবে এটি একটি আংশিক কর্মচঞ্চল যা চলছে তা বোঝার বিকল্প নয়।

>>> str(.1)
'0.1'

"রাউন্ডিং" আপনাকে ঠিক কী সমস্যা সৃষ্টি করছে তা আমি নিশ্চিত নই। আপনার আউটপুটটিকে আরও সুনির্দিষ্টভাবে নিয়ন্ত্রণের উপায় হিসাবে আপনি স্ট্রিং ফর্ম্যাটিংয়ের সাথে আরও ভাল করতে পারবেন?

যেমন

>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'

ডকুমেন্টেশন এখানে


12
len(repr(float(x)/3))

তবে আমি অবশ্যই বলব যে এটি আপনার মত বিশ্বাসযোগ্য নয়।

দশমিক সংখ্যা হিসাবে ভাসমানগুলি প্রবেশ করানো / প্রদর্শিত হয় তবে আপনার কম্পিউটার (আসলে, আপনার স্ট্যান্ডার্ড সি লাইব্রেরি) এগুলিকে বাইনারি হিসাবে সঞ্চয় করে। আপনি এই রূপান্তর থেকে কিছু পার্শ্ব প্রতিক্রিয়া পাবেন:

>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001

কেন এটি ঘটে তার ব্যাখ্যা পাই অজগর টিউটোরিয়ালের এই অধ্যায়ে

একটি সমাধান হ'ল এক ধরণের ব্যবহার করা যা বিশেষত দশমিক সংখ্যাগুলি ট্র্যাক করে, অজগরটির মতো decimal.Decimal:

>>> print len(str(decimal.Decimal('0.1')))
3

গুড পোস্ট কিভাবে বিভাজন থেকে ভাসা ফলাফল সঙ্গে কাজ করতে বিষয়ে: stackoverflow.com/questions/2958684/python-division
Trutane

3

অন্যান্য উত্তর ইতিমধ্যে উল্লেখ করেছে যে ভাসমান সংখ্যার উপস্থাপনা একটি কাঁটাযুক্ত বিষয়, কমপক্ষে বলতে গেলে।

যেহেতু আপনি আপনার প্রশ্নে পর্যাপ্ত প্রসঙ্গটি দিচ্ছেন না, তাই দশমিক মডিউলটি আপনার প্রয়োজনের জন্য কার্যকর হতে পারে কিনা তা আমি জানতে পারি না:

http://docs.python.org/library/decimal.html

অন্যান্য জিনিসগুলির মধ্যে আপনি স্পষ্টভাবে নির্দিষ্ট করতে পারেন যে আপনি সঠিকভাবে পেতে চান (ডক্স থেকে):

>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')

আমার প্রম্পট থেকে একটি সাধারণ উদাহরণ (পাইথন ২.6):

>>> import decimal
>>> a = decimal.Decimal('10.000000001')
>>> a
Decimal('10.000000001')
>>> print a
10.000000001
>>> b = decimal.Decimal('10.00000000000000000000000000900000002')
>>> print b
10.00000000000000000000000000900000002
>>> print str(b)
10.00000000000000000000000000900000002
>>> len(str(b/decimal.Decimal('3.0')))
29

এই সাহায্য করতে পারে? দশমিক ২.৪ থেকে পাইথন স্ট্ডলিবের সাথে পাইথন ২.6 সংযোজন রয়েছে।

আশা করি এটি সাহায্য করবে, ফ্রান্সেসকো


0

আমি জানি এটি খুব দেরী হয়েছে তবে যারা এখানে প্রথমবার আসছেন তাদের জন্য আমি একটি সমাধান পোস্ট করতে চাই। আমার একটি ফ্লোট মান indexএবং একটি স্ট্রিং রয়েছে imgfileএবং আপনার মতো আমারও একই সমস্যা ছিল। এইভাবে আমি বিষয়টি ঠিক করেছি

index = 1.0
imgfile = 'data/2.jpg'
out = '%.1f,%s' % (index,imgfile)
print out

আউটপুট হয়

1.0,data/2.jpg

আপনি আপনার সুবিধার্থে এই ফর্ম্যাট উদাহরণটি পরিবর্তন করতে পারেন।

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