我想将十进制数转换为科学记数法,以便返回除尾随零之外的所有小数。
示例:1230456.07890000
变为1.2304560789e6
我知道使用result=$(printf "%e" ${number})
可以给我科学记数法,但它会在第六个小数后减去数字:result=1.230456e+06
。
如果我使用例如"%e"
替换"%1.30e"
,则不准确会更改有效数字。
printf
命令的另一个问题是指数总是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命令来实现。