bash:将decimal转换为scientific,包括所有小数

时间:2014-09-18 09:53:42

标签: bash variables type-conversion

我想将十进制数转换为科学记数法,以便返回除尾随零之外的所有小数。

示例:1230456.07890000变为1.2304560789e6 我知道使用result=$(printf "%e" ${number})可以给我科学记数法,但它会在第六个小数后减去数字:result=1.230456e+06。 如果我使用例如"%e"替换"%1.30e",则不准确会更改有效数字。

printf命令的另一个问题是指数总是2位数,并且在正数时显示“+”。我希望指数失去前导零,只有在显示否定时才显示符号。

我希望有人可以帮助我!

2 个答案:

答案 0 :(得分:0)

您可以使用修饰符指定句点之后的位置数:

printf "%.10e\n" ${number}

所以你将获得1.2304560789e+06。您可以通过一些棘手的替换来过滤此结果:

result=$(printf "%.10e\n" ${number})
result=${result/e+/e}
result=${result/e0/e}
result=${result/e-0/e}

最后,您将获得:1.2304560789e6。 (已修复以添加负指数小于10的情况)。

答案 1 :(得分:0)

我发现了如何获得理想的结果:

# Create variable defining number of significant decimals
# by removing '.' and leading zeroes
length=$(echo "${number}" | sed -e 's/[0]*$//g' -e 's/\.//g' -e 's/^[0]*//g')
length=$((${#length}-1));   # Determine the number of decimals to be displayed

# Get scientific number with correct accuracy
result=$(printf "%1.${length}e" ${number})

# Adjust the exponent (can also be done using StefanF's answer)
result="${result%[eE]*}e"$(echo "${result#*[eE]}" | sed -e 's/+//g' -e 's/^0//' -e 's/-0/-/')

调整指数的最后一部分(删除“+”和前导零)也可以使用StefanoF建议的纯粹bash命令来实现。