বেশ কয়েকটি অনুরূপ প্রশ্নের উত্তর খোঁজার পরে, এটি আমার কাছে সেরা সমাধান বলে মনে হচ্ছে:
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
আমার যুক্তি:
%g
বৈজ্ঞানিক স্বরলিপি থেকে মুক্তি পান না।
>>> '%g' % 0.000035
'3.5e-05'
15 দশমিক স্থান অদ্ভুত আচরণ এড়ানোর জন্য বলে মনে হচ্ছে এবং এটি আমার প্রয়োজনের জন্য প্রচুর নির্ভুলতা রয়েছে।
>>> ('%.15f' % 1.35).rstrip('0').rstrip('.')
'1.35'
>>> ('%.16f' % 1.35).rstrip('0').rstrip('.')
'1.3500000000000001'
এর format(inputValue, '.15f').
পরিবর্তে আমি ব্যবহার করতে পারতাম '%.15f' % inputValue
তবে এটি কিছুটা ধীর (~ 30%)।
আমি ব্যবহার করতে পারতাম Decimal(inputValue).normalize()
, তবে এটিতে কয়েকটি সমস্যাও রয়েছে। একটির জন্য, এটি একটি অনেক ধীর গতি (11 ডলার)। আমি আরও দেখতে পেয়েছি যে এটির দুর্দান্ত দুর্দান্ত নির্ভুলতা থাকলেও এটি ব্যবহারের সময় এখনও নির্ভুলতা ক্ষতিগ্রস্থ হয় normalize()
।
>>> Decimal('0.21000000000000000000000000006').normalize()
Decimal('0.2100000000000000000000000001')
>>> Decimal('0.21000000000000000000000000006')
Decimal('0.21000000000000000000000000006')
সর্বাধিক গুরুত্বপূর্ণ, আমি এখনও এমন Decimal
একটি থেকে রূপান্তর করব float
যা আপনাকে সেখানে নাম্বারটি বাদ দিয়ে অন্য কিছু দিয়ে শেষ করতে পারে। আমি মনে করি Decimal
পাটিগণিতটি যখন থাকে Decimal
এবং Decimal
স্ট্রিং দিয়ে আদ্যক্ষর হয় তখন সর্বোত্তম কাজ করে ।
>>> Decimal(1.35)
Decimal('1.350000000000000088817841970012523233890533447265625')
>>> Decimal('1.35')
Decimal('1.35')
আমি নিশ্চিত যে Decimal.normalize()
প্রাসঙ্গিক সেটিংস ব্যবহার করে যা প্রয়োজন তা যথাযথভাবে সামঞ্জস্য করা যেতে পারে তবে ইতিমধ্যে ধীর গতি বিবেচনা করে এবং হাস্যকর নির্ভুলতার প্রয়োজন নেই এবং এই যে সত্য যে আমি এখনও ভাসা থেকে রূপান্তর করব এবং যাই হোক না কেন নির্ভুলতা হারাব, আমি করিনি এটি অনুধাবন করা উপযুক্ত বলে মনে হয় না।
আমি সম্ভাব্য "-0" ফলাফলের সাথে সম্পর্কিত নই যেহেতু -0.0 একটি বৈধ ভাসমান পয়েন্ট সংখ্যা এবং এটি সম্ভবত কোনও বিরল ঘটনা হবে তবে আপনি যেহেতু স্ট্রিংয়ের ফলাফলটি যতটা সম্ভব সংক্ষিপ্ত রাখতে চান বলে আপনি উল্লেখ করেছেন, আপনি খুব কম অতিরিক্ত গতির ব্যয়ে সর্বদা অতিরিক্ত শর্তযুক্ত ব্যবহার করতে পারে।
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
3.14 == 3.140
- তারা একই ভাসমান পয়েন্ট নম্বর। বিষয়টির জন্য 3.140000 একই ভাসমান-পয়েন্ট নম্বর। শূন্যের প্রথম স্থান নেই।