有没有办法在 bash 命令行中计算乘法和除法,以便出现句点后的前 3 位数字?

Ste*_*ott 3 command-line bash

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

\n
printf "%\'3.f\\n" $(((29246636)*4096))\n119,794,221,056\n
Run Code Online (Sandbox Code Playgroud)\n

该方程需要以 开始$((,也以 结束))Linux 命令行参考包含有关格式化文本的更多信息。

\n

我也有这样的:

\n
printf "%\'.3f \\n" $(((31200310)*4096))\n127,796,469,760.000\n
Run Code Online (Sandbox Code Playgroud)\n

我想确保除法时没有留下小数部分。

\n

实现这一目标的最佳方法是:

\n
printf "%\'.3f\\n" $(((((125046784)*512)/1024)/64))\n976,928.000\n
Run Code Online (Sandbox Code Playgroud)\n

但这是有问题的。最后三位数字始终显示为 .000,小数点后似乎没有记录小数部分。只要保证除法均匀,不留小数就可以了。但如果不是这样,答案似乎只是小数部分,小数点右边有零,没有迹象表明有小数部分

\n

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

\n

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

\n

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

\n

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

\n

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

\n
#!/bin/bash\n#This quoterm script takes two arguments: quoterm a b\n#Both a and b are integers and the result is a / b with a remainder of a % b\n\n a=$1;\n b=$2;\n\n printf "a=%\'3.f " $((a))\n printf "b=%\'3.f " $((b))\n printf "a/b = %\'3.f " $((a / b))\n printf "with the remainder of %\'3.f " $((a % b))\n printf "\\n"\n
Run Code Online (Sandbox Code Playgroud)\n

注意/usr/local/sbin的使用,我是从这个链接找到的: 3.16。/sbin:系统二进制文件。我还从此链接找到了脚本信息: The Linux Command Line: 32 \xe2\x80\x93 PositionalParameters - Accessing The Command Line

\n

ste*_*ver 11

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

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

然而 bash确实提供了一个余数运算符%,它允许您直接检查整除性:

$ (( (125046784*512) % (1024*64) == 0 )) && echo 'divisible' || echo 'not divisible'
divisible
$ 
$ (( (125046784*512) % (1024*63) == 0 )) && echo 'divisible' || echo 'not divisible'
not divisible
Run Code Online (Sandbox Code Playgroud)

如果您想计算商和余数而不仅仅是测试整除性,您可以组合/(整数除法)和%(余数) - 您甚至可以将其放入一个小 shell 函数中:

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

然后

$ quotrem 511 64
7 63
Run Code Online (Sandbox Code Playgroud)

或者

$ quotrem $(( 125046784*512/1024 )) 64
976,928 0
Run Code Online (Sandbox Code Playgroud)


Raf*_*ffa 6

既然您知道printf理解浮点数,我想在您的情况下有一些操作空间...bash不执行浮点数...这就是为什么以下内容不准确并且使用printf's float 说明符只是一种浪费,就像这样:

$ printf '%.3f\n' "$((129/64))"
2.000
Run Code Online (Sandbox Code Playgroud)

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

$ printf '%.3f\n' "$((1000*129/64))"
2015.000
Run Code Online (Sandbox Code Playgroud)

然后你得到所有的数字,但小数点从正确的位置向右移动了三位数字......所以,将其向后移动(参见尾数/指数),如下所示:

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

你会得到你想要的。

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

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

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

  • 十分优雅。你甚至可以通过偷偷地输入一两个守卫数字来正确地解决这个问题。 (2认同)