2012-11-29 74 views
6

Làm cách nào để lấy một số có số giây và hiển thị số giây trong hai chữ số thập phân? Psuedo mã để làm theo các chức năng dTime Tôi không chắc chắn về nhưng bạn sẽ nhận được những gì tôi đang nhắm cho tôi nghĩ.Cách hiển thị số đến hai chữ số thập phân trong hàm bash

function time { 
    echo "$(date +%N)/10000000" 
} 

function dTime { 
    echo "($1/100).(${$1:${#1}-3:${#1}-1})" 
} 

T=$time 
sleep 2 
T=$dTime T 
+0

bash chỉ thực hiện số học số nguyên. Câu hỏi của bạn có phần gây hiểu nhầm khi bạn hỏi về việc hiển thị một số đến hai chữ số thập phân và mã bạn hiển thị rõ ràng thực hiện số học dấu chấm động. –

+0

Sử dụng [printf] [1] và piggyback trên mã được thử nghiệm dài. [1]: http://stackoverflow.com/questions/4377871/sprintf-in-shell-scripting –

Trả lời

20

Bash có một hàm printf xây dựng trong:

printf "%0.2f\n" $T 
+1

Lưu ý rằng printf phụ thuộc vào cài đặt ngôn ngữ! Trong ví dụ Fr, ',' được sử dụng trong ngôn ngữ để tách biệt float, không phải '.'. Vì vậy, trong Fr, printf "% 0.2f \ n" 26.600 sẽ trả về lỗi (số phải được biểu thị là "26,600") – brunetton

4

Sau đây chia đầu ra của date +%N bởi 1000000000, viên đạn kết quả đến hai chữ số thập phân và gán kết quả vào biến T.

printf -v T "%.2f" $(bc -l <<< "$(date +%N)/1000000000") 

Nếu bạn chỉ muốn in những thứ,

bc <<< "scale=2; $(date +%N)/1000000000" 

Nếu bạn không thích bc và muốn sử dụng dc (đó là một chút nhẹ hơn và hài hước hơn nhiều để sử dụng vì nó là bóng ngược),

dc <<< "2 k $(date +%N) 1000000000/p" 

Chú ý sự khác biệt, với printf bạn sẽ có hàng đầu 0, không phải với bcdc. Có một sự khác biệt giữa printfbc (hoặc dc): printf vòng đến số gần nhất đến hai chữ số thập phân, trong khi bc (hoặc dc) làm tròn chính xác đến hai chữ số thập phân. Nếu bạn muốn hành vi sau này và gán cho một biến T kết quả, bạn có thể sử dụng, ví dụ,

T=$(dc <<< "2 k $(date +%N) 1000000000/p") 

hoặc, nếu bạn cũng muốn hàng đầu 0:

T=0.$(dc <<< "2 k $(date +%N) 1000000000/p") 
Các vấn đề liên quan