【问题标题】:How to use expr on float?如何在浮点数上使用 expr?
【发布时间】:2009-08-10 09:48:55
【问题描述】:

我知道这是一个非常愚蠢的问题,但我不知道如何在 bash 中做到这一点:

20 / 30 * 100

应该是66.67,但 expr 说的是0,因为它不支持浮点数。 Linux中什么命令可以代替expr做这个等号?

【问题讨论】:

  • 对不起,过失,当面最大值!
  • 对于数学运算,尝试使用 bc 或 awk ,而不是 bash 或 expr

标签: bash floating-point rounding fixed-point


【解决方案1】:

bc 会为您执行此操作,但顺序很重要。

> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00

或者,针对您的具体情况:

> export ach_gs=2
> export ach_gs_max=3
> x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc)
> echo $x
66.66

无论您选择哪种方法,都可以将其包含为一项让您的生活更轻松的功能:

#!/bin/bash
function pct () {
    echo "scale = $3; $1 * 100 / $2" | bc
}

x=$(pct 2 3 2) ; echo $x # gives 66.66
x=$(pct 1 6 0) ; echo $x # gives 16

【讨论】:

  • 但我想在脚本中执行此操作,整行是:$ach_gs / $ach_gs_max * 100
  • @maxorq:您可能会注意到,在其他人给出的所有示例中,乘法都是先完成的。这是一个科学计算的东西——因为我们知道小数点左边的数字比右边的数字多,所以乘法首先会减少由于舍入造成的精度损失。
【解决方案2】:

我一般用perl:

perl -e 'print 10 / 3'

【讨论】:

  • 这一定是一个非常基本的perl问题,但是这个命令在我的系统上只显示一个空行。 perl -e 'print "hello world"' 也不起作用。但perl -e 'print "hello world\n"' 确实按预期工作。
  • 恐怕我帮不上忙。我只能建议将, "\n" 添加到表达式的末尾:perl -e 'print 10 / 3, "\n"'
  • 谢谢,这个解决方法有效。 (并且您的命令在另一个 linux 环境中“按原样”运行)
  • 对于我们中间的 Pythonistas:python -c "print 10.0/3.0"
【解决方案3】:

只需在 awk 中完成

# awk 'BEGIN{print 20 / 30 * 100}'
66.6667

保存到变量

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667

【讨论】:

  • 这个答案很别扭。
  • 好答案。系统 awk 的变化比 bc 更大。
【解决方案4】:

如 bash 手册页中所述:

在某些情况下,shell 允许计算算术表达式...计算是在固定宽度的整数中完成的,不检查溢出,尽管除以 0 会被捕获并标记为错误。

您可以提前乘以 100 以获得更好的部分结果:

let j=20*100/30
echo $j

66

或者是 10 的更高倍数,并想象它所属的小数位:

let j=20*10000/30
echo $j

66666

【讨论】:

  • 如果您发布您使用的实际命令行可能会有所帮助。 (我猜你使用的零比我做的多。)我在发布之前执行了上面的命令,并得到了给出的结果。请先尝试。
  • 嗯,奇怪,我不记得最初在那里放了空格。无论如何,尝试删除你的空格并重复。我编辑了我的帖子以删除有问题的空格。
  • 问题是处理浮点数; bash "let" 返回整数
  • 是的,HidekiAI,这就是为什么我说“想象它所属的小数位”。返回结果 66666 表示实际值为 66666 * 10^-3。
【解决方案5】:
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

这是 paxdiablo 对答案的简化。 -l 将比例(小数点后的位数)设置为 20。它还加载了一个带有三角函数和其他东西的数学库。

【讨论】:

    【解决方案6】:

    另一个明显的选择:

    python -c "print(20 / 30 * 100)"
    

    假设您使用的是 Python 3。否则,请使用 python3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多