首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在bash命令行有任何方法来计算乘法和除法,以便在周期后出现前3位数字吗?

在bash命令行有任何方法来计算乘法和除法,以便在周期后出现前3位数字吗?
EN

Ask Ubuntu用户
提问于 2023-01-29 14:01:09
回答 4查看 1.2K关注 0票数 3

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

代码语言:javascript
运行
复制
printf "%'3.f\n" $(((29246636)*4096))
119,794,221,056

方程需要从$((开始,也需要以))结束。Linux命令行引用有关于格式化文本的更多信息。

我还有以下几点:

代码语言:javascript
运行
复制
printf "%'.3f \n" $(((31200310)*4096))
127,796,469,760.000

我想要确保,当有一个除法时,没有剩余的小数部分。

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

代码语言:javascript
运行
复制
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机器上使用它时,我都必须下载它。此外,它不是一个桌面图标,我只需双击输入所需的值并得到答案。也许其他人可以提出建议,如何在那里或以另一种方式改进。

代码语言:javascript
运行
复制
#!/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个位置参数-访问命令行

EN

回答 4

Ask Ubuntu用户

发布于 2023-01-29 15:22:27

你的问题似乎是描述一个XY问题

您想知道两个整数是否是可除的,您正试图通过执行浮点除法和检查结果中小数点之后的数字的值来实现这一点。正如您已经发现的,bash本机不支持浮点算法(尽管其他shell,包括zsh和ksh,do)。

但是bash <#>提供了一个余数操作符%,它允许您直接检查可分性:

代码语言:javascript
运行
复制
$ (( (125046784*512) % (1024*64) == 0 )) && echo 'divisible' || echo 'not divisible'
divisible
$ 
$ (( (125046784*512) % (1024*63) == 0 )) && echo 'divisible' || echo 'not divisible'
not divisible

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

代码语言:javascript
运行
复制
quotrem () 
{ 
    local int a=$1;
    local int b=$2;
    printf "%'d %'d\n" $(( a / b )) $(( a % b ))
}

然后

代码语言:javascript
运行
复制
$ quotrem 511 64
7 63

代码语言:javascript
运行
复制
$ quotrem $(( 125046784*512/1024 )) 64
976,928 0
票数 11
EN

Ask Ubuntu用户

发布于 2023-01-30 09:17:47

既然你知道printf理解浮动,我想在你的情况下有一些机动的空间. bash不做浮动.这就是为什么以下内容将是而不是准确的原因,而printf's浮法说明符的使用就像这样浪费了:

代码语言:javascript
运行
复制
$ printf '%.3f\n' "$((129/64))"
2.000

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

代码语言:javascript
运行
复制
$ printf '%.3f\n' "$((1000*129/64))"
2015.000

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

代码语言:javascript
运行
复制
$ printf '%.3f\n' "$((1000*129/64))e-3"
2.015

你就能得到你想要的。

此外,值得注意的是,当数字被缩短时,printf's浮动说明符将小数点之后的最后一个数字舍入.因此,正如@Paul_学究所指出的,通过添加一个额外的数字并相应地返回一个额外的数字,从而使数字更正确、更准确地被舍入是一个好主意:

代码语言:javascript
运行
复制
$ printf '%.3f\n' "$((10000*129/64))e-4"
2.016

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

票数 6
EN

Ask Ubuntu用户

发布于 2023-01-29 14:16:31

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

代码语言:javascript
运行
复制
echo "scale=3; 2.5 * 3.6" | bc

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

同样,对于组织来说,

代码语言:javascript
运行
复制
echo "scale=3; 2.5 / 3.6" | bc

这将在2.5除以3.6之后输出前3位数字。

票数 3
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1452461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档