将十进制值递增到下一个整数值

将十进制值递增到下一个整数值

我想通过 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

相关内容