2014-10-20 10 views
15

ठीक है, इसलिए मैं 17.92857 के इनपुट को गोल करने की कोशिश कर रहा हूं, ताकि इसे 17.929 में बाश में इनपुट मिल सके।फ्लोट पॉइंट नंबरों को घुमाएं

मेरे कोड अब तक है:

read input 
echo "scale = 3; $input" | bc -l 

हालांकि, जब मैं इस का उपयोग करें, यह दौर नहीं है, यह रिटर्न 17.928

क्या किसी को इसका कोई समाधान पता है?

+0

[इसे देखो] (http://stackoverflow.com/a/2395601/3913686) –

+0

आप परिवर्तनीय $ आउटपुट में printf के आउटपुट को असाइन करने के लिए 'printf -v आउटपुट"% .3f \ n "" $ इनपुट "का उपयोग कर सकते हैं। – Cyrus

+0

हैकरैंक से आना चाहिए (https://www.hackerrank.com/challenges/bash-tutorials--arithmetic-operations) – bergie3000

उत्तर

19

यदि input में कोई संख्या है, तो bc जैसे बाहरी कमांड की आवश्यकता नहीं है। तुम बस का उपयोग कर सकते printf:

printf "%.3f\n" "$input" 

संपादित करें: मामले में इनपुट एक सूत्र है, तो आप फिर भी bc निम्न कमांड में से एक के रूप में इस्तेमाल करना चाहिए है:

printf "%.3f\n" $(bc -l <<< "$input") 
printf "%.3f\n" $(echo "$input" | bc -l) 
+0

मैंने अपना जवाब बढ़ाया, देखें कि यह आपके लिए काम करता है या नहीं। –

1

एक छोटी सी चाल है अपने इनपुट में 0.0005 जोड़ें, इस तरह आप अपना नंबर सही ढंग से गोल कर लेंगे।

+0

या जैसे @Tim ने प्रिंटफ –

+0

का उपयोग किया है यदि आप तीन स्थानों पर घूम रहे हैं, तो आपको वास्तव में '.0005' जोड़ना चाहिए, न कि' .005'। लेकिन आप ऐसा क्यों नहीं कर सकते? –

+0

मैंने अपना जवाब संपादित किया, धन्यवाद! –

-2

अगर आप संख्या 17.928 के साथ दौर बंद त्रुटि मिल रही है इस कोशिश: पढ़ने y वी = echo "scale = 3; $y" |bc -l अगर [$ वी == 17.928]; तो गूंज "17.929" बाकी गूंज $ वी फाई

0

आप इस के लिए एक खोल सहायक समारोह round ${FLOAT} ${PRECISION} लिख सकते हैं:

#!/usr/bin/env bash 

round() { 
    printf "%.${2}f" "${1}" 
} 

PI=3.14159 

round ${PI} 0 
echo 
round ${PI} 1 
echo 
round ${PI} 2 
echo 
round ${PI} 3 
echo 
round ${PI} 4 
echo 
round ${PI} 5 
echo 
round ${PI} 6 
echo 

# Outputs: 
3 
3.1 
3.14 
3.142 
3.1416 
3.14159 
3.141590 

# To store in a variable: 
ROUND_PI=$(round ${PI} 3) 
echo ${ROUND_PI} 

# Outputs: 
3.142 
संबंधित मुद्दे