পাইথনের সাথে কীভাবে 2 দশমিক দিকে যায়?


253

আমি এই কোড (ফারেনহাইট থেকে সেলসিয়াস রূপান্তরকারী) এর আউটপুটে অনেক দশমিক পেয়েছি।

আমার কোডটি বর্তমানে এটির মতো দেখাচ্ছে:

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

সুতরাং আমার প্রশ্নটি হল, আমি কীভাবে 2 য় দশমিক জায়গায় প্রতিটি উত্তর প্রোগ্রামটি করব?


6
আপনার কোড সম্পর্কিত একটি ছোট মন্তব্য। ফারেনহাইট মানটি বিশ্বব্যাপী রাখার কোনও কারণ নেই, এটি আপনার ফাংশনগুলিতে প্যারামিটার হিসাবে প্রেরণ করা যথেষ্ট (এবং আরও ভাল)। সুতরাং, "গ্লোবাল ফারেনহাইট" লাইনটি সরান। ফর্মাল ফাংশনে, "ফাহরাইনহাইট" ফর্মেল (ফাহরহেনহাইট) ফাংশনটির প্যারামিটারটির নামকরণ করুন। রাউন্ডিংয়ের ক্ষেত্রে, কেবলমাত্র প্রথম 2 ডিজিট প্রদর্শন করতে আপনি "%" পরামিতি ব্যবহার করতে পারেন এবং এটি এই সংখ্যার জন্য বৃত্তাকার হওয়া উচিত। ফরমেলে সূত্রে প্রদত্ত সংখ্যার কোনও প্রভাব নেই।
আরিলিলি

উত্তর:


441

আপনি roundফাংশনটি ব্যবহার করতে পারেন , এটির প্রথম যুক্তি হিসাবে সংখ্যাটি গ্রহণ করে এবং দ্বিতীয় যুক্তিটি দশমিক বিন্দুর পরে যথার্থ হয় ision

আপনার ক্ষেত্রে, এটি হবে:

answer = str(round(answer, 2))


21
যাকে বলে ব্যাঙ্কারস রাউন্ডিং। এটি সমান সংখ্যার দিকে ঘুরবে। ভাসমান পয়েন্ট সংখ্যাগুলির জন্য এটি আইইইই 754 স্ট্যান্ডার্ডে রয়েছে। en.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz

37
আমি নিশ্চিত না যে লোকেরা উপরোক্ত মন্তব্যটিকে উজ্জীবিত করতে प्रेरित করেছিল। রেকর্ড, এটা সত্য যে জন্য round(2.675, 2)দেয় 2.67বদলে 2.68এ সব কিছুই ব্যাঙ্কারস রাউন্ডইং কি আছে।
মার্ক ডিকিনসন

3
দ্রষ্টব্য : এটি উত্তরের মান পরিবর্তন করে। আপনি কেবল প্রদর্শনের জন্য বৃত্তাকার করতে চান তাহলে, @Johnsyweb উত্তর দিয়ে যান - stackoverflow.com/a/20457284/1498405
hardmooth

4
@ জনসিওয়েব আমি আজ এটি চেষ্টা করছি, বছরের পরের মূল পোস্ট এবং এটি প্রত্যাশার মতো কাজ করছে বলে মনে হচ্ছে। সময়ের সাথে সাথে গোলাকার () বিকশিত মনে হচ্ছে। নীচে দেখুন: রাউন্ড (1.379, 2) -> 1.38 রাউন্ড (1.372, 2) -> 1.37 রাউন্ড (1.375, 2) -> 1.38
নাইটফুরি

81

ব্যবহার str.format()এর সিনট্যাক্স থেকে প্রদর্শন answer দুই দশমিক স্থান (এর অন্তর্নিহিত মূল্য পরিবর্তন ছাড়া সঙ্গে answer):

def printC(answer):
    print("\nYour Celsius value is {:0.2f}ºC.\n".format(answer))

কোথায়:

  • :ফর্ম্যাট অনুমিত পরিচয়
  • 0 সংখ্যার প্রকারের জন্য সাইন-সচেতন শূন্য-প্যাডিং সক্ষম করে
  • .2সেট স্পষ্টতা থেকে2
  • f একটি নির্দিষ্ট পয়েন্ট নম্বর হিসাবে নম্বর প্রদর্শন করে

3
এটিই সবচেয়ে দরকারী উত্তর আইএমও - আসল মান অক্ষুণ্ন রাখে এবং কার্যকর করা সহজ! ধন্যবাদ!
ব্রেটজে

কেন নিশ্চিত তা নয় তবে '{: 0.2f}'। ফর্ম্যাট (0.5357706) আমাকে '0.54' (পাইথন 3.6) দেয়
নোয়াম পেলে

3
@ নোমপিল্ড: কেন হবে না? 0.5357...এর 0.54চেয়ে কাছাকাছি 0.53, তাই 0.54বোধগম্যতার জন্য গোলাকার ।
শ্যাডোর্যাঞ্জার

"{:0.2f}".format(1.755)-> 1.75 "{:0.2f}".format(1.7551)-> 1.76 - তবে আমি উভয়ই সমান হবে বলে আশা করি 1.76।
জনোথন

(পাইথন সংস্করণ: 3.6.10)
জনোথন

48

সর্বাধিক উত্তর প্রস্তাবিত roundবা formatroundকখনও কখনও গোল হয়ে যায়, এবং আমার ক্ষেত্রে আমার পরিবর্তনশীলটির মান প্রয়োজন যাতে গোল হয়ে যায় এবং কেবল এটি প্রদর্শিত হয় না।

round(2.357, 2)  # -> 2.36

আমি উত্তরটি এখানে পেয়েছি: একটি নির্দিষ্ট দশমিক জায়গায় আমি কীভাবে একটি ভাসমান পয়েন্ট সংখ্যাটি বৃত্তাকার করব?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

বা:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d

1
আমি upvated - এই আমি খুঁজছিলাম ছিল; পাইথন-পোলোনিেক্স নিয়ে আপনার কাজটি আমি পছন্দ করি: ডি
স্কাইলার সেভল্যান্ড

2
"মানগুলি পাওয়ার মাইনাস এনডিজিটের 10 এর নিকটতম একাধিকের সাথে গোল হয়;" docs.python.org/3/library/funitions.html# চারপাশে তাই না, সর্বদা গোল হয় না, যেমনround(2.354, 2) # -> 2.35
পিট

@ পেটকিরখাম আপনি ঠিক বলেছেন, আমি আরও উত্তর এবং নির্ভুল করতে আমার উত্তর সম্পাদনা করেছি।
s4w3d0ff

2
-0.54 <-0.53
s4w3d0ff

2
আমি 10**dপরিবর্তে ব্যবহার করতে হবে int('1' + ('0' * d))
জোনাথন রাইনহার্ট


8

আপনি আপনার উত্তর গোল করতে চান।

round(value,significantDigit)এটি করার সাধারণ সমাধান, তবে এটি কখনও কখনও অঙ্ক যেমন গণিতের দৃষ্টিকোণ থেকে প্রত্যাশা করে তখনই কাজ করে না যখন অঙ্কটি অবিলম্বে নিকৃষ্টতর (বাম দিকে) আপনি যে অঙ্কটি ঘুরছেন তা রয়েছে 5

অবিশ্বাস্য আচরণের কয়েকটি উদাহরণ এখানে:

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

আপনার অভিপ্রায় ধরে নেওয়া যাক বিজ্ঞান পরিসংখ্যান ঐতিহ্যগত রাউন্ডইং করতে হয়, এই একটি কুশলী মোড়কের পেতে হয় roundফাংশন পরিশ্রমী হিসাবে প্রয়োজন প্রত্যাশিত importমত অতিরিক্ত কাপড় Decimal

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

আহা! সুতরাং এর ভিত্তিতে আমরা একটি ফাংশন করতে পারি ...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)

মূলত এটি স্ট্রিংটিতে একটি সত্যিই ছোট মান যুক্ত করে এটি অনাকাঙ্ক্ষিত উদাহরণগুলিতে এটি সঠিকভাবে গোল করে জোর করতে বাধ্য করে যেখানে এটি roundআপনি যখন প্রত্যাশা করেন তখন এটি ফাংশনটির সাথে সাধারণত হয় না । যোগ করার জন্য একটি সুবিধাজনক মান 1e-Xযেখানে Xসংখ্যা স্ট্রিং আপনি ব্যবহার করার চেষ্টা করছি দৈর্ঘ্য হল roundপ্লাসে 1

ব্যবহারের পদ্ধতিকে 10**(-len(val)-1)ইচ্ছাকৃতভাবে করা হয়েছিল, কারণ এ স্থানটি শিফটকে জোর করার জন্য আপনি সবচেয়ে বড় সংখ্যক সংখ্যক সংখ্যক যুক্ত করতে পারেন, পাশাপাশি এটিও নিশ্চিত করে যে আপনি যে মানটি যুক্ত করেন তা কখনই দশমিক .অনুপস্থিত থাকলেও বৃত্তাকার পরিবর্তন করে না। আমি আরও বিয়োগের জন্য কেবলমাত্র 10**(-len(val))একটি কনডিডিশনাল দিয়ে ব্যবহার করতে পারি ... তবে কেবল সর্বদা বিয়োগ করা সহজ যেটি এই দশমিক সংখ্যার প্রযোজ্য পরিসীমাটিকে পরিবর্তিত করবে না যা এই কর্মক্ষেত্রটি সঠিকভাবে পরিচালনা করতে পারে। আপনার মানগুলি ধরণের সীমাতে পৌঁছে গেলে এই পদ্ধতিটি ব্যর্থ হবে, এটি ব্যর্থ হবে তবে বৈধ দশমিক মানের প্রায় পুরো পরিসরের জন্য এটি কাজ করা উচিত।if (val>1)11

সুতরাং সমাপ্ত কোডটি এমন কিছু হবে:

def main():
    printC(formeln(typeHere()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nYour Celsius value is " + answer + " C.\n"

main()

... আপনার প্রত্যাশিত ফলাফলগুলি দেওয়া উচিত।

এটি সম্পাদন করার জন্য আপনি দশমিক লাইব্রেরিটিও ব্যবহার করতে পারেন তবে আমার প্রস্তাবিত মোড়কটি সহজ এবং কিছু ক্ষেত্রে পছন্দসই হতে পারে।


সম্পাদনা করুন: ব্ল্যাকঙ্কহিট ধন্যবাদ জানানোর জন্য যে 5ফ্রিঞ্জ কেসটি এখানে কিছু নির্দিষ্ট মানের জন্য ঘটে থাকে ।


6

কেবল% .2f দিয়ে ফর্ম্যাটিংটি ব্যবহার করুন যা আপনাকে 2 দশমিকের চেয়ে কম করে দেয়।

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

4

আপনি পাইথন "%" এর স্ট্রিং ফর্ম্যাটিং অপারেটর ব্যবহার করতে পারেন। "% .2f" এর অর্থ দশমিক বিন্দুর পরে 2 ডিজিট।

def typeHere():
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/library/stdtypes.html#string-formatting


4

আপনি 2 দশমিক পর্যন্ত রাউন্ড অপারেটর ব্যবহার করতে পারেন

num = round(343.5544, 2)
print(num) // output is 343.55

3

আপনি রাউন্ড ফাংশন ব্যবহার করতে পারেন।

round(80.23456, 3)

আপনাকে 80.234 এর উত্তর দেবে

আপনার ক্ষেত্রে, ব্যবহার করুন

answer = str(round(answer, 2))

আশাকরি এটা সাহায্য করবে :)


2

আপনার যদি প্রয়োজন হয় ভাসমান পয়েন্ট সমস্যা এড়ানো অ্যাকাউন্টিংয়ের জন্য রাউন্ডিং নম্বরে ন্যাকা রাউন্ড ব্যবহার করতে পারেন।

আপনার নাম্পতি ইনস্টল করা দরকার:

pip install numpy

এবং কোড:

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

কপি করে প্রিন্ট

2.67
2.68

আপনি যদি আইনী রাউন্ডিংয়ের সাথে অর্থ পরিচালনা করেন তবে এটি আপনার ব্যবহার করা উচিত।


1

এখানে আমি ব্যবহার করেছি একটি উদাহরণ:

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)

1

কেন তা নিশ্চিত নয় তবে '{: 0.2f}'। ফর্ম্যাট (0.5357706) আমাকে '0.54' দেয়। আমার জন্য একমাত্র সমাধান (অজগর 3.6) কাজ করে যা নিম্নলিখিত:

def ceil_floor(x):
    import math
    return math.ceil(x) if x < 0 else math.floor(x)

def round_n_digits(x, n):
    import math
    return ceil_floor(x * math.pow(10, n)) / math.pow(10, n)

round_n_digits(-0.5357706, 2) -> -0.53 
round_n_digits(0.5357706, 2) -> 0.53

এটি গোলাকার নয়, কাটছে।
শ্যাডোর্যাঞ্জার

0

যেহেতু আপনি দশমিক সংখ্যায় আপনার উত্তর চান তাই আপনাকে প্রিন্ট সি () ফাংশনে আপনার উত্তর পরিবর্তনশীল টিআর টাইপ করতে হবে না ।

এবং তারপরে মুদ্রণ-স্টাইলের স্ট্রিং ফর্ম্যাটিং ব্যবহার করুন


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