我想通过 shell 脚本将十进制值增加到下一个整数值。
例如:
i=**1.6** then I need to print i=**2**
i=**1.00001** then I need to print i=**2**
i=**1.00049** then also I need to print the value as i=**2**
所以无论如何,如果十进制值大于 0.00000001,我需要将该值打印为 2。
答案1
你的问题有点模棱两可。如果您想要下一个整数,无论小数部分是什么,下面是一个答案sh
:
echo $((${i%.*} + 1))
如果你想要下一个整数(如果小数部分大于 0),这里有一个答案sh
:
[ -n "${i##*.*[1-9]*}" ]
echo $(( ${i%.*} + $? ))
i
(如果小数点后有非 0 的数字,则第一个测试以 1 退出,否则以 0 退出;$?
包含退出值)
恕我直言,同样的想法bash
更具可读性:
[[ "$i" != *.*[1-9]* ]]
echo $(( ${i%.*} + $? ))
使用 POSIX expr
,因此与任何 shell 兼容:
expr "${i%.*}" + \( "${i##*.*[1-9]*}" = "" \)
答案2
通过awk
并添加0.5
到结果中,然后.f
将其自动四舍五入到最接近的数字。
awk -F\= 'BEGIN{printf("%.f\n", $2+0.5)}'
答案3
if [[ '1' -eq "$(echo "$i > ${i%.*}" | bc)" ]]; then
i=$((${i%.*}+1))
else
i=${i%.*}
fi
答案4
假设bash。
要处理任意数量的小数,我们需要一个允许任意精度的程序,例如bc
:
$ round(){ bc <<< "a=$1"'; scale=0; b=a/1; if (a==b) a else b+1'; }
$ for i do round "$i"; done
1.0000
2
2
2
或作为文本处理:
$ round(){ reg='^([0-9]*)\.0*[1-9]'; [[ $1 =~ $reg ]] && echo "$((${1%%.*}+1))" || echo "$1"; }
$ set 1.0000 1.6 1.00001 1.00049
$ for i do round "$i"; done
1.0000
2
2
2