मैं अभी भी एक शुद्ध bc
उत्तर की तलाश कर रहा हूं कि किसी फ़ंक्शन के भीतर केवल एक मान को कैसे गोल किया जाए, लेकिन यहां एक शुद्ध bash
उत्तर है:
#!/bin/bash
echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
embiggen() {
local int precision fraction=""
if [ "$1" != "${1#*.}" ]; then # there is a decimal point
fraction="${1#*.}" # just the digits after the dot
fi
int="${1%.*}" # the float as a truncated integer
precision="${#fraction}" # the number of fractional digits
echo $(( 10**10 * $int$fraction / 10**$precision ))
}
# round down if negative
if [ "$float" != "${float#-}" ]
then round="-5000000000"
else round="5000000000"
fi
# calculate rounded answer (sans decimal point)
answer=$(( ( `embiggen $float` * 100 + $round ) / `embiggen 1.18` ))
int=${answer%??} # the answer as a truncated integer
echo $int.${answer#$int} # reassemble with correct precision
read -p "Press any key to continue..."
मूल रूप से, यह सावधानीपूर्वक दशमलव को निकालता है, सब कुछ 100 बिलियन (10 100 10**10
इंच bash
) से गुणा करता है, सटीक और गोलाई के लिए समायोजित करता है, वास्तविक विभाजन करता है, उचित परिमाण में वापस विभाजित करता है, और फिर दशमलव को पुन: स्थापित करता है।
क्रमशः:
embiggen()
समारोह प्रदान करती है करने के लिए अपने तर्क के रूप पूर्णांक छोटा कर दिया $int
और में डॉट के बाद संख्या की बचत होती है $fraction
। भिन्नात्मक अंकों की संख्या में नोट किया गया है $precision
। गणित पलता 10¹⁰ के संयोजन से $int
और $fraction
और फिर समायोजित कर देता है कि सटीक मैच के लिए (जैसे embiggen 48.86
10¹⁰ × 4886/100 और रिटर्न हो जाता है 488600000000
जो 488,600,000,000 है)।
हम सौवें की एक अंतिम परिशुद्धता चाहते हैं, इसलिए हम पहले नंबर को 100 से गुणा करते हैं, गोलाई के उद्देश्यों के लिए 5 जोड़ते हैं, और फिर दूसरे नंबर को विभाजित करते हैं। का यह काम $answer
एक सौ गुना अंतिम जवाब में हमें पत्ते।
अब हमें दशमलव बिंदु जोड़ने की आवश्यकता है। हम इसके अंतिम दो अंकों $int
को $answer
छोड़कर एक नया मान प्रदान करते हैं , फिर echo
यह एक बिंदु और पहले से ध्यान $answer
रखे गए $int
मूल्य को छोड़कर । (कभी भी सिंटैक्स हाइलाइटिंग बग पर ध्यान न दें जो इसे एक टिप्पणी की तरह दिखाई देता है)
(बैशिज़्म: एक्सपोज़रिएशन POSIX नहीं है, इसलिए यह बैशिज़्म है। एक शुद्ध POSIX सॉल्यूशन के लिए दस की शक्तियों का उपयोग करने के बजाय शून्य जोड़ने की आवश्यकता होगी।
zsh
मेरे शेल के रूप में उपयोग किए जाने वाले मुख्य कारणों में से एक यह है कि यह फ्लोटिंग पॉइंट गणित का समर्थन करता है। इस सवाल का हल एकदम सीधा है zsh
:
printf %.2f $((float/1.18))
(मुझे लगता है कि किसी ने इस उत्तर के लिए एक टिप्पणी जोड़ दी है, जिसमें ट्रिम के साथ अंकगणित को सक्षम करने के लिए इस उत्तर को जोड़ा जा सकता है bash
, लेकिन मुझे पूरा यकीन है कि ऐसी सुविधा अभी तक मौजूद नहीं है।)