在 bash 命令行中是否有任何方法可以计算乘法和除法,以便显示句点后的前 3 位数字?

在 bash 命令行中是否有任何方法可以计算乘法和除法,以便显示句点后的前 3 位数字?

我目前使用以下命令在 bash 命令行中每三位数字用逗号分隔进行计算:

printf "%'3.f\n" $(((29246636)*4096))
119,794,221,056

该等式需要以 开头$((,也以 结尾))Linux 命令行参考资料包含有关格式化文本的更多信息。

我也有:

printf "%'.3f \n" $(((31200310)*4096))
127,796,469,760.000

我想确保进行除法运算时没有剩余的小数部分。

实现此目的的最佳方法是:

printf "%'.3f\n" $(((((125046784)*512)/1024)/64))
976,928.000

但这是有问题的。最后三位数字总是看起来像.000小数部分似乎没有记录在小数点后。只要除法是保证均匀,没有小数剩余。但如果不是这样,答案似乎只是小数部分,小数点右边有零,并且没有迹象表明有小数部分

我知道这个问题看起来很简单。但由于这个潜在的陷阱,我现在最终使用 Linux Ubuntu 计算器而不是更简单的命令行。

感谢大家提供任何见解,使这个除法和小数余数的计算在命令行上更容易。是的,我确实尝试过 64.0 而不是 64,这时我得到了一个语法错误。也许需要使用一些更复杂的东西。

我找到了这个参考资料:“如何打印浮点数小数点后前三位数字?

但我仍然不明白在这种情况下如何应用它才能获得所需的结果。任何帮助都将不胜感激。

阅读建议后,我想出了以下 bash 脚本,并将其存储在在/usr/local/sbin/quotrem这样我就可以从任何命令提示符访问它。这个脚本仍然缺乏,因为我必须下载每次我想在不同的 Ubuntu 机器上使用它时,我都需要手动输入。另外,它不是一个桌面图标,我只需双击它就可以输入所需的值并获得答案。也许其他人可以提出如何改进它或其他方法的建议。

#!/bin/bash
#This quoterm script takes two arguments: quoterm a b
#Both a and b are integers and the result is a / b with a remainder of a % b

 a=$1;
 b=$2;

 printf "a=%'3.f " $((a))
 printf "b=%'3.f " $((b))
 printf "a/b = %'3.f " $((a / b))
 printf "with the remainder of %'3.f " $((a % b))
 printf "\n"

请注意使用在/usr/local/sbin 中,我是从这个链接找到的: 3.16. /sbin:系统二进制文件。我还从这个链接找到了脚本信息: Linux 命令行:32 – 位置参数 - 访问命令行

答案1

您的问题似乎描述了XY问题

你想知道两个整数是可整除的,你试图通过执行浮点除法,并检查结果中小数点后的数字的值。正如您所发现的,bash 本身并不支持浮点运算(尽管其他 shell,包括 zsh 和 ksh,都支持)。

然而 b提供一个余数运算符%,允许您直接检查可除性:

$ (( (125046784*512) % (1024*64) == 0 )) && echo 'divisible' || echo 'not divisible'
divisible
$ 
$ (( (125046784*512) % (1024*63) == 0 )) && echo 'divisible' || echo 'not divisible'
not divisible

如果你想要计算商和余数而不是仅仅测试可除性,你可以结合/(整数除法)和%(余数) - 你甚至可以把它放在一个小的 shell 函数中:

quotrem () 
{ 
    local int a=$1;
    local int b=$2;
    printf "%'d %'d\n" $(( a / b )) $(( a % b ))
}

然后

$ quotrem 511 64
7 63

或者

$ quotrem $(( 125046784*512/1024 )) 64
976,928 0

答案2

既然你知道printf理解浮点数,我想你的情况还是有一些操作空间的......bash不做浮点数......这就是为什么下面会不是是准确的,并且使用printf浮点说明符只是浪费,就像这样:

$ printf '%.3f\n' "$((129/64))"
2.000

但是如果您预期并将任何预期的浮点结果变为整数,例如乘以 1000,因为您希望小数点后有三位数字,如下所示:

$ printf '%.3f\n' "$((1000*129/64))"
2015.000

然后你得到所有的数字小数点从正确位置向右移动了三位……因此,将其移回(尾数/指数)像这样:

$ printf '%.3f\n' "$((1000*129/64))e-3"
2.015

你就会得到你想要的。

此外,可能值得注意的是,printf当数字缩短时,浮点说明符会对小数点后的最后一个数字进行舍入......因此,正如@Paul_Pedant,最好从这种行为中受益,通过添加额外的数字并相应地返回小数点后一位额外的数字,使数字四舍五入得更正确/更准确,如下所示:

$ printf '%.3f\n' "$((10000*129/64))e-4"
2.016

注意:这是一个简单的例子,向您展示了它是如何完成的,但在复杂的算术运算中可能不是那么简单......所以,做好功课,知道哪些算术运算符优先,并以正确的顺序/位置乘以 1000。

答案3

您可以使用命令行实用程序(如 bc)执行浮点运算并格式化输出以仅显示句点后的前 3 位数字。例如,要将 2.5 乘以 3.6 并仅显示句点后的前 3 位数字,您可以使用以下命令:

echo "scale=3; 2.5 * 3.6" | bc

此命令使用 echo 将字符串“scale=3; 2.5 * 3.6”传递给 bc 命令,该命令将其解释为浮点算术表达式。scale 命令将小数点后的位数设置为 3,并使用 * 运算符执行乘法。输出将是句点后的前三位数字。

同样对于 Division,

echo "scale=3; 2.5 / 3.6" | bc

这将输出 2.5 除以 3.6 后的前 3 位数字

答案4

根据 bash 手册页,^ARITHMETIC EVALUATION语法仅支持固定宽度整数(( ... )),因此最好的选择是使用外部工具(例如bc,如其他答案中所示)。

相关内容