ฉันยังคงหา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¹⁰ 10**10
ในbash
) ปรับความแม่นยำและปัดเศษทำการหารจริงหารกลับไปที่ขนาดที่เหมาะสมแล้วใส่ทศนิยมอีกครั้ง
เป็นขั้นเป็นตอน:
embiggen()
กำหนดฟังก์ชั่นตัดทอนจำนวนเต็มรูปแบบของการโต้แย้งในการและบันทึกหมายเลขหลังจากจุดใน$int
จำนวนของตัวเลขเศษส่วนที่มีการระบุไว้ใน$fraction
$precision
คูณคณิตศาสตร์10¹⁰โดยเรียงต่อกันของ$int
และ$fraction
จากนั้นจึงปรับที่เพื่อให้ตรงกับความแม่นยำ (เช่นembiggen 48.86
กลายเป็น10¹⁰× 4886/100 และผลตอบแทน488600000000
ซึ่งเป็น 488600000000)
เราต้องการความแม่นยำขั้นสุดท้ายเป็นร้อยส่วนเราจึงคูณจำนวนแรกด้วย 100 เพิ่ม 5 สำหรับการปัดเศษแล้วหารจำนวนที่สอง การมอบหมายนี้$answer
ทำให้เราได้คำตอบสุดท้ายเป็นร้อยเท่า
ตอนนี้เราต้องเพิ่มจุดทศนิยม เรากำหนด$int
ค่าใหม่เพื่อ$answer
ยกเว้นตัวเลขสองหลักสุดท้ายจากนั้นecho
จะมีจุดและ$answer
ไม่รวม$int
ค่าที่ได้รับการดูแลแล้ว (ไม่ต้องสนใจข้อผิดพลาดของการเน้นไวยากรณ์ที่ทำให้สิ่งนี้ปรากฏเป็นความคิดเห็น)
(Bashism: การยกกำลังไม่ใช่ POSIX ดังนั้นนี่คือ bashism โซลูชัน POSIX ที่บริสุทธิ์จะต้องใช้ลูปเพื่อเพิ่มค่าศูนย์แทนที่จะใช้พลังสิบนอกจากนี้ "embiggen" เป็นคำที่สมบูรณ์แบบที่สุด)
หนึ่งในเหตุผลหลักที่ฉันใช้zsh
เป็นเชลล์ของฉันก็คือมันรองรับคณิตศาสตร์เลขทศนิยม คำตอบสำหรับคำถามนี้ค่อนข้างตรงไปตรงมาในzsh
:
printf %.2f $((float/1.18))
(ฉันชอบที่จะเห็นใครบางคนเพิ่มความคิดเห็นในคำตอบนี้ด้วยเคล็ดลับในการเปิดใช้งานการคำนวณเลขทศนิยมbash
แต่ฉันค่อนข้างมั่นใจว่าคุณลักษณะดังกล่าวยังไม่มีอยู่)