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 ไม่ควรอยู่ในคำตอบที่ยอมรับแทนที่จะเป็นคำถามใช่หรือไม่ ก่อนที่ฉันจะอ่านคำตอบฉันไม่รู้เลยว่าความคิดเห็นนี้หมายถึงอะไร
Wilson F

1
@WilsonF เพิ่มการอ้างอิงไปยังคำตอบ
Adam Matan

2
@ กระทะมันไม่ได้ขึ้นอยู่กับการหารหรือการคูณ มันขึ้นอยู่กับอินพุต - จำนวนความแม่นยำที่ใหญ่ที่สุดกำหนดความแม่นยำในเอาต์พุต สังเกตว่า1234*1.0จะให้คุณได้อย่างไร1234.0
Richlv

คำตอบ:


70

ตั้งค่าscaleตัวแปรพิเศษ:

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

3
ดูความคิดเห็นของ @ Wok ​​เกี่ยวกับคำถาม
Adam Matan

$ echo "scale=2; (100/180)*180" | bcให้ 99.00 :(
Donatas Olsevičius

@ DonatasOlsevičiusนี่เป็นเพราะ (100/180) = 0.55 และ (0.55 * 180) = 99 ดังนั้นมันจึงให้คุณค่าที่ถูกต้องกับคุณ :)
Kamaldeep singh Bhatia

.5มันจะดีถ้ามันโค้งขึ้นถ้าข้างต้น หากปัดเศษขึ้นนี้จะเป็น~$ echo "scale=2; 12/104" | bc .11 .12อย่างไรก็ตามมันก็ควรจะทำงานให้สำเร็จ
jbrock

3
echo "result = (100/180) * 180; scale=2; result / 1" | bc -lคุณสามารถรักษาความแม่นยำจนพิมพ์ค่าด้วยวิธีนี้: 99.99ตอนนี้คุณจะได้รับ
Byron Hawkins

10

scaleใช้งานได้สำหรับการแบ่งเท่านั้น หาก geeks บางอย่างต้องการมันในการคูณคุณสามารถทำได้โดยใช้การจัดการสตริง บอกว่าถ้าคุณต้องคูณ32 * 0.60, 19.20คำตอบคือ หากคุณต้องการตอบเพียง 19 ข้อเท่านั้นคุณสามารถทำได้หลายวิธี

  1. ใช้การจัดการสตริง

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

    ไวยากรณ์การจัดการสตริง: ${Variable%pattern}สิ่งนี้จะลบรูปแบบการจับคู่แบบสั้นที่มาหลังจาก%นั้น สำหรับรายละเอียดเพิ่มเติม String จัดการดูขั้นสูงทุบตี Scripting-Guide

  2. ใช้Scaleตามที่ระบุไว้โดย**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. หากต้องการกำจัด 0 ต่อท้ายแทนที่จะจัดการสตริงคุณสามารถทำการหารด้วย 1 ได้

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

โปรดทราบว่าดังที่ฉันพูดถึงในความคิดเห็นของฉันในคำถามนั้นไม่ได้เกิดจากการคูณ แต่เกิดจากการป้อนตัวเลขที่มีส่วนทศนิยม หรือเพื่อให้แตกต่างกันตัวเลขที่มีส่วนทศนิยม "ที่ยาวที่สุด" จะเป็นตัวกำหนดจำนวนตำแหน่งทศนิยมที่เอาต์พุตจะมี
Richlv

4

นอกจากคำตอบก่อนหน้า

echo "scale=2; 1.0150876" | bc

ผลตอบแทน

1.0150876

เพิ่มการดำเนินการทางคณิตศาสตร์เพื่อให้ได้เพียง 2 ตัวเลขทศนิยม - (NUMBER * 100) / 100

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

ตอนนี้กลับมา

1.01

3

คุณสามารถใช้คำสั่ง printf เพื่อปัดเศษผลลัพธ์ได้มากถึง 3 ทศนิยม

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

2

หมดยก

scale = 2 ตัดคำตอบให้เป็นทศนิยมสองหลัก แต่เราสามารถปัดเศษได้ดังนี้:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.