在bash/bc中将(整数、精度)对转换为浮点

在bash/bc中将(整数、精度)对转换为浮点,bash,shell,bc,Bash,Shell,Bc,我有两个数字,$value和$precision。我需要对这些数字进行“浮点”表示(当然输出实际上是字符串,因为这是bash) $precision告诉我数字应该有多少个小数点 例如: $value=123, $precision=2 这将给出输出“1.23” 我怎样才能在Bash中优雅地完成这个任务?我正在看“bc”手册页,但我真的看不到任何方法。我认为最简单的方法是将输入值视为字符串,并以某种方式将字符“.”插入正确的位置。在bc中: bc <<EOF scale = $p

我有两个数字,$value和$precision。我需要对这些数字进行“浮点”表示(当然输出实际上是字符串,因为这是bash)

$precision告诉我数字应该有多少个小数点

例如:

  $value=123, $precision=2
这将给出输出“1.23”

我怎样才能在Bash中优雅地完成这个任务?我正在看“bc”手册页,但我真的看不到任何方法。我认为最简单的方法是将输入值视为字符串,并以某种方式将字符“.”插入正确的位置。

bc
中:

bc <<EOF
scale = $precision
$value / (10 ^ $precision)
EOF
在卑诗省
bc

bc <<EOF
scale = $precision
$value / (10 ^ $precision)
EOF

好的,我找到了一些Bash的字符串操作帮助。。。这确实奏效,但并不漂亮。把它贴在这里给后人看

lastIndex=$((${#value}-1))
dotIndex=$((${#value}-$precision))
decvalue=${value:0:$dotIndex}.${value:$dotIndex:$lastIndex}

好的,我找到了一些Bash的字符串操作帮助。。。这确实奏效,但并不漂亮。把它贴在这里给后人看

lastIndex=$((${#value}-1))
dotIndex=$((${#value}-$precision))
decvalue=${value:0:$dotIndex}.${value:$dotIndex:$lastIndex}

你真的不需要背后的滴答声或回声;您可以只使用:
decvalue=“${value:0:$precision}.${value:$last}”
,其中双引号也是可选的。另外,这不是给出了
12.3
而不是
1.23
?谢谢!我的表情有问题,实际上给了我1.3。。。但现在它给了我12.3,就像你说的。有什么建议可以扭转这一局面吗?好的,我想这就成功了。但是它很丑!另一方面,我的整个脚本使用sed解决方案在0.190s左右运行,使用这个丑陋的解决方案在0.180s左右运行!;-)嗯,我希望你每次使用这个脚本时都能充分利用额外的1/100秒:)你的修改版本看起来就像我要汇编的一样。我注意到
bash
可以从Perl学习中受益,负偏移量意味着“从字符串末尾开始”可能很方便(这将为您节省一些计算)。。。还是O(n)。没关系。你真的不需要背上的滴答声或回声;您可以只使用:
decvalue=“${value:0:$precision}.${value:$last}”
,其中双引号也是可选的。另外,这不是给出了
12.3
而不是
1.23
?谢谢!我的表情有问题,实际上给了我1.3。。。但现在它给了我12.3,就像你说的。有什么建议可以扭转这一局面吗?好的,我想这就成功了。但是它很丑!另一方面,我的整个脚本使用sed解决方案在0.190s左右运行,使用这个丑陋的解决方案在0.180s左右运行!;-)嗯,我希望你每次使用这个脚本时都能充分利用额外的1/100秒:)你的修改版本看起来就像我要汇编的一样。我注意到
bash
可以从Perl学习中受益,负偏移量意味着“从字符串末尾开始”可能很方便(这将为您节省一些计算)。。。还是O(n)。没关系。我会选择sed解决方案,至少我能读懂它。在Solaris 10上,bc表达式给出了以下错误:第1行出现语法错误,teletype@Jolta:抱歉,我在测试时大脑冻结,我从“缩放”行中删除了“=”作为一个通过尝试的修复(在我意识到我没有设置bash变量之前,如果您需要知道的话)。在点击submit之前,我没有重新修改它。我将使用sed解决方案,至少我可以阅读和理解它。在Solaris 10上,bc表达式给出了以下错误:第1行出现语法错误,teletype@Jolta:抱歉,我在测试时大脑冻结,我从“缩放”行中删除了“=”作为一个通过尝试的修复(在我意识到我没有设置bash变量之前,如果您需要知道的话)。在点击提交之前我没有重新校准。