目前,我使用以下方法在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
但这是有问题的。最后三位数字always似乎是.000,小数部分似乎没有记录在小数点之后。只要除法是guaranteed,即使没有分数剩余的,也是可以的。但是如果不是这样的话,答案似乎只是小数点右边有零的小数部分,并且no表示有小数部分。
我知道这个问题似乎很简单。但是现在,由于这个潜在的陷阱,我最终使用的是Linux计算器,而不是简单的命令行。
感谢大家的任何见解,使这个计算除法和小数余数在命令行上更容易。而且,是的,I确实尝试了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 :系统二进制文件。我还从这个链接中找到了脚本信息:The Linux命令行:32个位置参数-访问命令行
发布于 2023-01-29 15:22:27
你的问题似乎是描述一个XY问题
您想知道两个整数是否是可除的,您正试图通过执行浮点除法和检查结果中小数点之后的数字的值来实现这一点。正如您已经发现的,bash本机不支持浮点算法(尽管其他shell,包括zsh和ksh,do)。
但是bash <#>提供了一个余数操作符%
,它允许您直接检查可分性:
$ (( (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
发布于 2023-01-30 09:17:47
既然你知道printf
理解浮动,我想在你的情况下有一些机动的空间. bash
不做浮动.这就是为什么以下内容将是而不是准确的原因,而printf
's浮法说明符的使用就像这样浪费了:
$ 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
's浮动说明符将小数点之后的最后一个数字舍入.因此,正如@Paul_学究所指出的,通过添加一个额外的数字并相应地返回一个额外的数字,从而使数字更正确、更准确地被舍入是一个好主意:
$ printf '%.3f\n' "$((10000*129/64))e-4"
2.016
<#>注意:这是一个简单的示例,可以向您展示它是如何完成的,但在复杂的算术操作中可能并不那么简单.所以,做你的家庭作业,知道哪些算术运算符优先,并以正确的顺序/位置乘以1000。
发布于 2023-01-29 14:16:31
您可以使用命令行实用程序(如bc )来执行浮点运算,并格式化输出以显示句点后的前3位数字。例如,若要将2.5乘3.6并仅显示句点后的前3位数字,可以使用以下命令:
echo "scale=3; 2.5 * 3.6" | bc
此命令使用echo将字符串"scale=3;2.5 * 3.6“传递给bc命令,bc命令将其解释为浮点算术表达式。scale命令将小数点后的数字数设置为3,并使用*运算符执行乘法。输出将是周期后的前三位数。
同样,对于组织来说,
echo "scale=3; 2.5 / 3.6" | bc
这将在2.5除以3.6之后输出前3位数字。
https://askubuntu.com/questions/1452461
复制相似问题