पायथन के साथ 2 दशमलव तक गोल कैसे करें?


254

मुझे इस कोड (फ़ारेनहाइट से सेल्सियस कनवर्टर) के आउटपुट में बहुत अधिक दशमलव मिल रहा है।

मेरा कोड वर्तमान में इस तरह दिखता है:

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 दशमलव स्थान पर हर उत्तर के लिए कार्यक्रम कैसे बनाऊं?


7
आपके कोड के बारे में एक छोटी सी टिप्पणी। फ़ारेनहाइट मान को वैश्विक रखने के लिए कोई कारण नहीं है, यह आपके कार्यों के पैरामीटर के रूप में इसे प्रसारित करने के लिए पर्याप्त (और बेहतर) है। तो, "वैश्विक फ़ारेनहाइट" लाइन को हटा दें। फॉर्मेलन फ़ंक्शन में, पैरामीटर को फ़ंक्शन "फारेनहाइट" फॉर्मेलन (फारेनहाइट) पर पुनर्नामित करें। गोलाई के लिए, आप केवल पहले 2 अंकों को प्रदर्शित करने के लिए "%" मापदंडों का उपयोग कर सकते हैं, और इसे इन अंकों के लिए गोल किया जाना चाहिए। सूत्र में दिए गए अंकों की संख्या पर कोई प्रभाव नहीं पड़ता है।
अरियली

जवाबों:


443

आप उपयोग कर सकते हैं round फ़ंक्शन का , जो इसके पहले तर्क को संख्या के रूप में लेता है और दूसरा तर्क दशमलव बिंदु के बाद सटीक है।

आपके मामले में, यह होगा:

answer = str(round(answer, 2))


21
इसे बैंकर्स गोलाई कहते हैं। यह सम संख्या की ओर बढ़ता है। यह फ्लोटिंग पॉइंट नंबरों के लिए IEEE 754 मानक में है। en.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz

37
मुझे यकीन नहीं है कि उपरोक्त टिप्पणी को बढ़ावा देने के लिए लोगों ने क्या प्रेरित किया। रिकॉर्ड के लिए, तथ्य यह है कि बजाय round(2.675, 2)देता है बैंकर गोलाई के साथ कुछ भी नहीं है। 2.672.68
मार्क डिकिन्सन

3
नोट : इससे उत्तर का मूल्य बदल जाता है। यदि आप केवल प्रदर्शन के लिए राउंड करना चाहते हैं, तो @Johnsyweb - stackoverflow.com/a/20457284/1498405
हार्डमैट

4
@Johnsyweb मैं आज कोशिश कर रहा हूँ, मूल पोस्ट के बाद साल और यह उम्मीद के मुताबिक काम कर रहा है। समय के साथ गोल () विकसित हुआ। नीचे देखें: राउंड (1.379, 2) -> 1.38 राउंड (1.372, 2) -> 1.37 राउंड (1.375, 2) -> 1.38
नाइटफ्री

82

का उपयोग करते हुए str.format() की वाक्य रचना को प्रदर्शित answer दो दशमलव स्थानों (के अंतर्निहित कीमत को बदले बिना साथ answer):

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

कहाँ पे:

  • :प्रारूप युक्ति का परिचय देता है
  • 0 सांख्यिक प्रकारों के लिए साइन-जागरूक शून्य-पैडिंग सक्षम करता है
  • .2को सटीक सेट करता है2
  • f संख्या को एक निश्चित बिंदु संख्या के रूप में प्रदर्शित करता है

3
यह सबसे उपयोगी उत्तर है IMO - वास्तविक मूल्य को बरकरार रखता है और लागू करने के लिए सरल है! धन्यवाद!
ब्रेटज

यकीन नहीं क्यों, लेकिन '{: 0.2f}'। स्वरूप (0.5357706) मुझे '0.54' (अजगर 3.6) देता है
नोम पेलेड

3
@NoamPeled: ऐसा क्यों नहीं होना चाहिए? 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
मैंने उत्थान किया - यह वही है जिसकी मुझे तलाश थी; मुझे अजगर-पोलीनीक्स के साथ आपका काम पसंद है: D
Skylar Saveland

2
"मानों को शक्ति माइनस ndigits के 10 के निकटतम गुणक में गोल किया जाता है;" docs.python.org/3/library/functions.html#round so no, राउंड हमेशा गोल नहीं होता है, जैसेround(2.354, 2) # -> 2.35
पीट किर्कहम

@PeteKirkham आप सही हैं, मैंने अपने उत्तर को अधिक समझदार और सटीक बनाने के लिए संपादित किया।
s4w3d0ff

2
-0.54 राउंडिंग के लिए सही उत्तर है -0.5357706 नीचे क्योंकि यह एक ऋणात्मक संख्या है, -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

जैसा कि आप दशमलव संख्या में अपना उत्तर चाहते हैं, इसलिए आपको प्रिंट उत्तर () फ़ंक्शन में अपने उत्तर चर को टाइप करने की आवश्यकता नहीं है ।

और फिर प्रिंटफ-स्टाइल स्ट्रिंग फॉर्मेटिंग का उपयोग करें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.