【问题标题】:bash divide result compared with floatbash 除法结果与浮点数相比
【发布时间】:2011-11-28 19:39:52
【问题描述】:

这是我的 bash 代码的一部分;

        b=`cat 101127_2_aa_1.fastq|head -$a|tail -1|sed 's/\(.\)B*$/\1/g'|wc -c`
        d=`cat 101127_2_aa_1.fastq|head -$a|tail -1|wc -c`
        if (($b%$d>=0.7))
        then

但是我遇到了这样的问题:

line 13: ((: 26%100>=0.7: syntax error: invalid arithmetic operator (error token is ".7")

有什么问题? 谢谢

编辑: 我的脚本中有两个 if 循环:

if (($a%4==0))
if (( 10*$b/$d>= 7 ))

似乎是第一个,只有“%”有效

对于第二个,只有“/”有效

我很困惑

【问题讨论】:

  • thx....但是我该怎么办?
  • 您是要取模,还是要除法并弄乱运算符?如果取模,那么你最好描述你在做什么,在浮点数上使用模...... :) 你的变量名无助于易读性。如果是你想要的除法,那么($b*10)/$d>=7 应该可以工作。
  • 是的,除法是我想要的。但是,当使用 if (($a%4)) 时,效果很好。我的意思是“%”与“/”,我应该使用哪一个?
  • 好吧,除法是/echo $((200/3))66% 是模(除法的余数),所以 echo $((200%3)) 给出 2(因为 200 = 66 * 3 + 2)。两者在bash 中都是语法,但它们做的事情截然不同。

标签: bash floating-point divide


【解决方案1】:

除法运算符是/,而不是%

bash 也没有浮点数。解决方法是做类似的事情

if (( 10 * $b / $d >= 7 ))

if (( 10 * $b >= 7 * $d ))

【讨论】:

  • 我猜他想要模运算符......但从代码来看,也许除法是他真正想要的。 :)
  • 是的,除法就是我想要的
  • 但是,关于运算符,当我执行 if (( $a%4==2 )) 时,它的效果非常好。所以“%”与“/”,......我很困惑......
  • 模 (%) 给出除法的余数,并且始终是整数。因此 Bash 永远不会抱怨。 '/' 运算符是一个除法,可以产生实数(非整数)值。
  • @JRFerguson - bash 中没有真正有价值的操作。 if (( 4 / 3 == 5 /4 )) ; then echo there are no real valued operations in bash ; fi
【解决方案2】:

BASH 是一种没有浮点运算的无类型编程语言。但是,您可以使用 bc 工具进行浮点运算。以下文章很好地解释了如何:http://www.linuxjournal.com/content/floating-point-math-bash。您需要的是 float_cond() 函数。

【讨论】:

    【解决方案3】:

    我会使用awk

    这里有一些例子。

    [jaypal:~] awk 'BEGIN{ print 44/3 }'
    14.6667
    
    [jaypal:~] a=55
    [jaypal:~] b=4
    [jaypal:~] awk 'BEGIN { print '$a'/'$b' }'
    13.75
    

    正如 @Amadan 所建议的,我们可以在 awk 中完全做这样的事情 -

    a=44
    b=5
    c=$(awk 'BEGIN { print '$a'/'$b' }')
    awk 'BEGIN{if ('$c'>.7) print "yeah"; else print "nope" }'
    

    【讨论】:

    • 不,它仍然不起作用。似乎 bash 无法直接将任何内容与 float 进行比较(在本例中为 $c)...但仍然非常感谢
    • 如果你要使用awk,或bc,或perl,或Ruby或bash之外的任何东西,也可以在那里进行比较,因为bash可以' t 根本不处理小数点。问题不在于除法(这只是不精确) - 问题在于 0.7 文字(在您的解决方案中,13.75 也是如此),bash 根本无法解析。
    • 谢谢@Amadan,我已经改变了答案。
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多