我目前使用以下命令在 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
,如其他答案中所示)。