【问题标题】:How to divide floating point numbers using variables with integer result?如何使用具有整数结果的变量来划分浮点数?
【发布时间】:2016-07-12 23:40:44
【问题描述】:
answer=$(echo $(( length / 1024 )) | bc -l)

所以长度是一个变量,其值类似于2402267538.,需要除以1024

执行此操作会引发此错误

")syntax error: invalid arithmetic operator (error token is " 

【问题讨论】:

  • Your comment here 是由文本中的“回车”字符(Windows 中的行尾)引起的。从变量length 中删除它们以使所有工作正常。可能是这样的:length=${length//[!-0-9]/}

标签: bash shell scripting centos bc


【解决方案1】:

切换到ksh 会简化任务:

$ length=2402267538

$ answer=$((length/1024.00))
$ echo $answer
2345964.392578125

awk 的一种方式:

$ answer=$(awk "BEGIN{printf(\"%f\n\",$length/1024);}")
$ echo $answer
2345964.392578

如果您只需要结果的整数部分(适用于bashksh):

$ answer=$((length/1024))
$ echo $answer
2345964

如果你的长度变量是一个浮点数,你可以这样修剪它:

$ length=2402267538.12
$ ilength=${length%%.*}
$ answer=$((ilength/1024))
$ echo $answer
2345964

【讨论】:

  • 使用上面的语句,如何只保留小数点前的值??
  • 不要像这样在awk中使用shell变量,使用-v var="$var"将它传递给awk
  • @anubhava 我通常不会。不过这不是禁止的,只是需要小心。
【解决方案2】:

当你这样做时:

echo $(( length / 1024 )) | bc -l

bc -l 之前的小数点后部分已经丢失,因为$(( length / 1024 )) 执行整数除法。

你可以像这样使用bc -l

length="2402267538"
answer=$(bc -l <<<"scale=2; $length / 1024")
echo "$answer"

2345964.39

使用awk 更详细一点:

answer=$(awk -v len=$length 'BEGIN{printf "%.2f\n", len/1024}')
echo "$answer"

2345964.39

或者这个:

answer=$(awk -v len=$length 'BEGIN{printf "%d\n", len/1024}')
echo "$answer"

2345964

【讨论】:

  • 第一个答案,抛出这样的错误(standard_in)1:非法字符:^M,第二个答案计算后保留两个十进制值
  • 如果您不想限制为 2 位小数,请使用:awk -v len=$length 'BEGIN{printf "%f\n", len/1024}'
  • 显然,这很好 answer=$(awk -v len=$length 'BEGIN{printf "%.0f\n", len/1024}') echo $answer
猜你喜欢
  • 2023-03-25
  • 2021-04-29
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多