bc: đặt số chữ số sau dấu thập phân


52

bc xử lý số dưới dạng số nguyên:

# echo "100/3" | bc
33

bc -l xử lý số dưới dạng đối tượng dấu phẩy động:

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

Có cách nào để giới hạn số chữ số sau dấu thập phân không?


10
Thật thú vị, điều này chỉ hoạt động với phân chia. Nếu bạn muốn làm scale=0;1234*1.1, bạn phải viết nó như scale=0;1234*1.1/1để có được 1357. Nếu không, bất kể giá trị của scale, bạn nhận được 1357.4.
Cháo

Không nên bình luận của @Wok về câu trả lời được chấp nhận, thay vì câu hỏi? Cho đến khi tôi đọc câu trả lời, tôi không biết bình luận này đề cập đến điều gì.
Wilson F

1
@WilsonF Đã thêm một tham chiếu cho câu trả lời.
Adam Matan

2
@Wok, nó không phụ thuộc vào phép chia hay phép nhân. Nó phụ thuộc vào đầu vào - số chính xác lớn nhất xác định độ chính xác trong đầu ra. Lưu ý cách 1234*1.0sẽ cung cấp cho bạn1234.0
Richlv

Câu trả lời:


70

Đặt scalebiến đặc biệt:

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

3
Xem bình luận của @ Wok ​​về câu hỏi.
Adam Matan

$ echo "scale=2; (100/180)*180" | bccho 99,00 :(
Donatas Olsevičius

@ DonatasOlsevičius điều này là do (100/180) = 0,55 và sau đó (0,55 * 180) = 99. Vì vậy, nó mang lại cho bạn giá trị đúng :)
Kamaldeep singh Bhatia

Sẽ thật tốt nếu nó làm tròn lên nếu ở trên .5. ~$ echo "scale=2; 12/104" | bc .11 Nếu làm tròn số này sẽ là .12. Tuy nhiên, nó vẫn nên làm công việc cho nhiệm vụ của tôi.
jbrock

3
Bạn có thể duy trì độ chính xác cho đến khi in giá trị theo cách này : echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Bây giờ bạn có được 99.99.
Byron Hawkins

11

scalechỉ làm việc cho bộ phận; nếu một số chuyên viên máy tính cần nó trong phép nhân, thì bạn có thể đạt được điều này bằng cách sử dụng thao tác chuỗi. Nói nếu bạn cần nhân 32 * 0.60, trả lời là 19.20. Nếu bạn cần lấy nó 19 một mình trong câu trả lời, bạn có thể lấy nó bằng các phương pháp khác nhau.

  1. Sử dụng thao tác chuỗi

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

    Cú pháp thao tác chuỗi : ${Variable%pattern}, điều này sẽ xóa mẫu phù hợp ngắn đi sau %. Để biết thêm chi tiết thao tác Chuỗi, xem Hướng dẫn Bash-Scripting nâng cao .

  2. Sử dụng Scalenhư đã nêu**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Để thoát khỏi các dấu 0, thay vì thao tác chuỗi, người ta cũng có thể thực hiện chia cho 1.

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

Lưu ý rằng, như tôi đã đề cập trong nhận xét của mình về câu hỏi, nó không phải do phép nhân, mà là do các số đầu vào có phần thập phân. Hoặc, nói cách khác, số có phần thập phân "dài nhất" sẽ xác định số lượng thập phân mà đầu ra sẽ có.
Richlv

4

Ngoài các câu trả lời trước

echo "scale=2; 1.0150876" | bc

Trả về

1.0150876

Thêm các phép toán để chỉ nhận 2 số thập phân - (SỐ * 100) / 100

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

Bây giờ trở lại

1.01

3

bạn cũng có thể sử dụng lệnh printf để làm tròn kết quả lên tới 3 số thập phân

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

2

Làm tròn số

scale = 2 cắt câu trả lời thành hai chữ số thập phân, nhưng chúng ta có thể đạt được kết quả như sau:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.