如何在 Linux Bash 脚本中进行浮点数学运算如何在 Linux Bash 脚本中进行浮点数学运算如何在 Linux Bash 脚本中进行浮点数学运算如何在 Linux Bash 脚本中进行浮点数学运算
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

如何在 Linux Bash 脚本中进行浮点数学运算

发表 admin at 2025年2月28日
类别
  • 未分类
标签

当足够接近还不够好时,您需要浮点数。

要点

  • Linux Bash shell 仅支持整数运算,无法对浮点数进行计算。
  • Linux 中的 bc 实用程序允许以交互方式和在 shell 脚本中进行精确浮点计算。
  • 使用 bc,您可以设置要显示的小数位数并以任意精度执行计算,包括使用标准数学库中的函数。

Linux Bash shell 仅支持整数运算。它既不能理解也不能处理浮点计算。 bc 实用程序以交互方式和在 shell 脚本中为您提供精确的浮点计算。

为什么 Bash 只支持整数

将 UnixBourne shell 限制为整数运算的最初设计决策可能源于早期计算将整数映射到 RAM 的单字节。我们可能永远不知道这个决定背后的真正原因是什么。就此而言,Bourne shell 的 Linux 版本(Bash shell)也选择效仿。

就其本身而言,Bash 无法对浮点数执行计算,并且对答案中包含小数部分的整数的计算将报告为截断的整数值。这在命令行和 Bash shell 脚本中都是如此。根据您的使用案例,这可能会出现问题或出现问题。

Linux 附带了两个实用程序应用程序,允许您执行浮点计算。其中之一是直流电。这有点奇怪,因为它以逆波兰表示法进行操作。另一个工具是bc。它可以交互使用或作为命令使用,这就是我们将在这里讨论的解决方案。

相关:9 个 Bash 脚本示例

问题

让 Bash 将六除以三。

echo $((6 / 3))

我们得到了预期的答案:两个。现在我们用六除以七。显然,这将有一个分数答案。

echo $((6 / 7))

零显然是错误的。我们再试一次,用 16 除以 7。

echo $((16 / 7))

我们得到两个答案。发生的情况是答案的小数部分被丢弃,因此答案被截断。第一个示例中没有小数部分,因此我们得到了正确的答案。

第二个示例的答案中没有整数元素,只有小数部分。因为小数部分已被丢弃,所以我们显示的答案为零。

在第三个示例中,7 除以 16 两次,并有小数余数。同样,余数被丢弃,结果被截断。

交互使用 bc

您可以通过输入 bc 并按“Enter”键将 bc 用作交互式计算器。

bc

bc 应用程序启动,宣布其版本号,然后等待您的输入。输入计算并按“Enter”键将使 bc 评估计算并显示答案。

16 * 4
1024 / 32
2^2 * 1024

您可以使用“Ctrl+L”清除屏幕,使用“Ctrl+D”退出程序。让我们尝试一个计算,答案中将包含小数部分。

22 / 7

这不是我们所期望的。与直觉相反,虽然 bc 允许我们使用任意精度,但默认情况下它不会显示小数点及其后面的任何数字。

为了使真实答案可见,我们需要告诉 bc 要显示多少位小数。我们使用“scale”命令来做到这一点。我们会要求小数点后七位,然后重新计算。

scale=7
22 / 7

终于,我们有所进展了。 “比例”设置将保持不变,直到您更改它为止。设置小数位数告诉 bc 要显示的最大位数。如果答案不需要那么多小数位,则会显示所需的小数位数,不再显示更多。它不会被无意义的零填充。

scale=10
0.300003 * 0.5

您可以使用分号“;”在同一行列出不同的计算。将他们分开。答案像往常一样按计算列出的顺序显示在每行上。

25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9

您也可以在列表中包含“缩放”命令。

scale=8; 22 / 7; scale=3; 0.3 * 0.071

标准数学库

-l(标准数学库)选项使 bc 加载一组函数,并将“scale”设置为小数点后 20 位。

bc -l
22 / 7

加载标准库后,您可以在计算中使用这些函数。

  • s (x):x 的正弦
  • c (x):x 的余弦。
  • a (x):x 的反正切
  • l (x):x的自然对数
  • e (x):e 对 x 值的指数
  • j (n,x):x的整数阶n的贝塞尔函数。

正弦、余弦和反正切使用弧度值。

s (1.1)
 
c (.891207)
 
a (.628473)

在命令行上将输入发送到 bc

您可以使用重定向和管道将输入发送到 bc。它处理您的输入并在终端窗口中显示答案。

您可以使用或不使用 -l(标准数学库)选项重定向到 bc。

bc <<< 22/7
bc -l <<< 22/7

要将输入通过管道传输到 bc,输入必须是另一个进程的输出。使用 echo 来实现这一点很方便。

echo 22/7 | bc
echo 22/7 | bc -l

如果您的输入中有空格,或者想要包含“scale”命令,请将输入用引号引起来。

echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc

在 Bash Shell 脚本中使用 bc

我们现在已经拥有了能够在 bash 脚本中执行浮点计算所需的一切,并达到我们选择的精度。我们还可以在计算中引用 Bash 变量,包括脚本的参数。

这是我们的示例脚本。将此文本复制到编辑器中,将其另存为“pi.sh”,然后关闭编辑器。

#!/bin/bash
first_number=22
second_number=7
pi=$(echo "scale=$1; $first_number/$second_number" | bc)
echo "Pi to $1 decimal places is: $pi"

我们使用两个变量“first_number”和“second_number”来保存两个数值。我们在通过管道传输到 bc 的输入中使用这些变量。

我们还使用传递给脚本的第一个命令行参数“$1”作为设置“scale”的值。

在尝试我们的脚本之前,我们需要使用 chmod 使其可执行。

chmod +x pi.sh

让我们尝试使用不同的命令行值的脚本。

./pi.sh 5
./pi.sh 14
./pi.sh 20

我们将 pi 显示到我们在脚本的命令行上指定的多个位置。

相关:如何使用 getopts 解析 Linux Shell 脚本选项

一切加起来

超越 Bash 仅整数数学的限制使我们的脚本具有精确性和准确性。

在脚本内使用 echo 将输入传送到 bc 有点笨拙,但它工作得很好,而且好处是值得的。

©2015-2025 Norria support@norria.com