bc: दशमलव बिंदु के बाद अंकों की संख्या निर्धारित करें


52

bc पूर्णांक के रूप में संख्याओं को संभालता है:

# echo "100/3" | bc
33

bc -l फ्लोटिंग पॉइंट ऑब्जेक्ट के रूप में संख्याओं को संभालता है:

# echo "100/3" | bc -l
33.33333333333333333333

क्या दशमलव बिंदु के बाद अंकों की संख्या को सीमित करने का एक तरीका है?


10
दिलचस्प है, यह केवल विभाजन के साथ काम करता है। यदि आप करना चाहते हैं scale=0;1234*1.1, तो आपको इसे scale=0;1234*1.1/1प्राप्त करने के लिए लिखना होगा 1357। अन्यथा, कोई फर्क नहीं पड़ता scale, आप प्राप्त करते हैं 1357.4
वोक

क्या प्रश्न के बजाय @Wok की टिप्पणी को स्वीकृत उत्तर पर नहीं होना चाहिए? जब तक मैं जवाब नहीं पढ़ता, मुझे पता नहीं था कि इस टिप्पणी का क्या जिक्र है।
विल्सन एफ

1
@WilsonF ने उत्तर का एक संदर्भ जोड़ा।
एडम मटन

2
@Wok, यह विभाजन या गुणा पर निर्भर नहीं है। यह इनपुट पर निर्भर करता है - सबसे बड़ी सटीक संख्या आउटपुट में सटीक निर्धारित करती है। ध्यान दें कि 1234*1.0आपको कैसे दिया जाएगा1234.0
रिक्लेव

जवाबों:


70

scaleविशेष चर सेट करें :

$ echo "scale=2; 100/3" | bc
33.33

3
प्रश्न पर @ वोक की टिप्पणी देखें।
एडम मटन

$ echo "scale=2; (100/180)*180" | bc99.00 देता है :(
डोनाटास ओलसेविसियस

@ DonatasOlsevičius इसका कारण यह है (100/180) = 0.55 और फिर (0.55 * 180) = 99. तो यह आपको सही मूल्य दे रहा है :)
कमलदीप सिंह भाटिया

ऊपर से गोल हो जाए तो अच्छा होगा .5~$ echo "scale=2; 12/104" | bc .11 अगर गोल किया जाता है तो यह होगा .12। हालांकि, यह अभी भी मेरे काम के लिए काम करना चाहिए।
jbrock

3
आप इस तरह से मूल्य को प्रिंट करने तक सटीक बनाए रख सकते हैं echo "result = (100/180) * 180; scale=2; result / 1" | bc -l:। अब आप प्राप्त करें 99.99
बायरन हॉकिंस

10

scaleकेवल विभाजन के लिए काम करता है; यदि कुछ geeks को गुणा में इसकी आवश्यकता है, तो आप स्ट्रिंग हेरफेर का उपयोग करके इसे प्राप्त कर सकते हैं। कहो कि क्या आपको गुणा करना है 32 * 0.60, उत्तर है 19.20। यदि आपको उत्तर में अकेले 19 प्राप्त करने की आवश्यकता है तो आप इसे विभिन्न तरीकों से प्राप्त कर सकते हैं।

  1. स्ट्रिंग हेरफेर का उपयोग करना

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    स्ट्रिंग मैनिपुलेशन सिंटैक्स:, ${Variable%pattern}यह छोटे मिलान पैटर्न को हटा देगा जो बाद में आता है %। अधिक स्ट्रिंग हेरफेर के विवरण के लिए उन्नत बैश-स्क्रिप्टिंग गाइड देखें

  2. Scaleद्वारा बताए अनुसार प्रयोग करना**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. अनुगामी 0s से छुटकारा पाने के लिए, स्ट्रिंग हेरफेर के बजाय, व्यक्ति 1 से विभाजन भी कर सकता है।

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    

ध्यान दें कि, जैसा कि मैंने प्रश्न पर अपनी टिप्पणी में उल्लेख किया है, यह गुणन के कारण नहीं है, बल्कि एक दशमलव भाग वाले इनपुट संख्याओं के कारण है। या, इसे अलग तरीके से रखने के लिए, "सबसे लंबे" दशमलव भाग के साथ संख्या यह निर्धारित करेगी कि आउटपुट में कितने दशमलव स्थान होंगे।
रिक्लेव

4

पिछले उत्तरों के अलावा

echo "scale=2; 1.0150876" | bc

रिटर्न

1.0150876

केवल 2 दशमलव संख्याएँ प्राप्त करने के लिए गणित संचालन जोड़ें - (NUMBER * 100) / 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

अब लौटता है

1.01

3

आप 3 डेसीमल तक के परिणाम को राउंड ऑफ करने के लिए प्रिंटफ कमांड का भी उपयोग कर सकते हैं

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333

2

पूर्णांक करना

स्केल = 2 दो दशमलव अंकों के उत्तर को काट देता है, लेकिन हम इस तरह गोल-गोल प्राप्त कर सकते हैं:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.