bc: ondalık noktadan sonraki hane sayısını ayarlayın


52

bc sayıları tamsayı olarak işler:

# echo "100/3" | bc
33

bc -l sayıları kayan nokta nesneleri olarak işler:

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

Ondalık noktadan sonra basamak sayısını sınırlamanın bir yolu var mı?


10
İlginçtir, bu sadece bölünme ile çalışır. Eğer yapmak istiyorsanız scale=0;1234*1.1, bunu olarak yazmak zorunda scale=0;1234*1.1/1olsun 1357. Aksi takdirde, değeri ne olursa olsun, scaleolsun 1357.4.
Wok

@Wok'un yorumu, sorudan ziyade, kabul edilen cevapta olmamalı mıydı? Cevabı okuyana kadar bu yorumun neyi kastettiği hakkında hiçbir fikrim yoktu.
Wilson F,

1
@WilsonF Cevabına bir referans eklendi.
Adam Matan

2
@ Wok, bölmeye veya çarpmaya bağlı değildir. Girdiye bağlıdır - en büyük hassas sayı, çıktıdaki kesinliği belirler. 1234*1.0Size nasıl vereceğinize dikkat edin1234.0
Richlv 17:16

Yanıtlar:


70

scaleÖzel değişkeni ayarlayın :

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

3
@ Wok'un soru hakkındaki yorumuna bakınız.
Adam Matan

$ echo "scale=2; (100/180)*180" | bc99.00 :( verir
Donatas Olsevičius

@ DonatasOlsevičius bunun nedeni şudur: (100/180) = 0.55 ve sonra (0.55 * 180) = 99. Yani size doğru değeri veriyor :)
Kamaldeep singh Bhatia

Eğer yukarı yuvarlanırsa iyi olurdu .5. ~$ echo "scale=2; 12/104" | bc .11 Yuvarlanırsa bu olur .12. Ancak, yine de görevim için işi yapmalı.
jbrock

3
Sen değerini bu şekilde baskı kadar hassas koruyabilirsiniz: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Şimdi anladın 99.99.
Byron Hawkins

10

scalesadece bölünme için çalışır; Bazı ineklerin çarpma işleminde ihtiyacı varsa, o zaman dize manipülasyonu kullanarak bunu yapabilirsiniz. Diyelim ki çoğalmanız gerekiyorsa 32 * 0.60, cevap 19.20. Cevabınızla 19 yalnız almanız gerekiyorsa, farklı yöntemlerle alabilirsiniz.

  1. Dize Manipülasyonunu Kullanma

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

    Dize Manipülasyonu sözdizimi: ${Variable%pattern}bu, daha sonra gelen kısa eşleşen deseni siler %. Daha fazla String işleme detayları için Advanced Bash-Scripting Guide'a bakınız .

  2. 'De Scalebelirtildiği gibi kullanma**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. İzleyen 0'lardan kurtulmak için, dize işlemi yerine, biri de 1 ile bölünebilir.

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

Unutmayın, soru hakkındaki yorumumda bahsettiğim gibi, bunun çarpımdan kaynaklanmadığı, bunun yerine ondalık bölümü olan giriş sayılarından kaynaklandığını unutmayın. Veya farklı bir ifadeyle, "en uzun" ondalık bölüme sahip olan sayı çıktının kaç ondalık basamak alacağını belirler.
Richlv

4

Önceki cevaplara ek olarak

echo "scale=2; 1.0150876" | bc

İade

1.0150876

Yalnızca 2 ondalık sayı almak için Matematik işlemleri ekleyin - (NUMBER * 100) / 100

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

Şimdi döner

1.01

3

3 ondalık basamağa kadar sonuç çıkarmak için printf komutunu da kullanabilirsiniz.

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

2

Yuvarlama

scale = 2 yanıtı iki ondalık basamağa keser, ancak şu şekilde tamamlama yapabiliriz:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.