我正在尝试将十进制转换为特定的科学记数法格式:
-2.802479940 ==> -.2802479940E + 01 3.796137791 ==> 0.3796137791E + 01
等等。基本上,在负数和前导零上没有前导零 在正数上。我已经能够用大E科学记谱打印出来了 但不知道如何强制领导部分只是' - '或'0'。
答案 0 :(得分:0)
这是做你想做的C代码:
void numfmt(double d, char* buf) {
int exp=0;
int cont=1;
char sign = '0';
if (d < 0) {
sign = '-';
d = -d;
}
while(cont) {
if (d >= 1.0) {
exp ++;
d /= 10.0;
} else if (d < 0.1) {
exp --;
d *= 10.0;
} else
cont = 0;
}
sprintf(buf,"%12.10fE%+03d",d,exp);
*buf = sign;
}
答案 1 :(得分:0)
这有点难看(据我所知,它没有任何内置的string-formatting options),但它应该按你想要的那样做:
import re
nums = [-2.802479940, 3.796137791, -0.012, 0.035, 0, 100, -200]
decimal_digits = 10
for n in nums:
num = ('{:.'+str(decimal_digits-1)+'E}').format(n)
# increment exponent
exp_search = re.search(r'E(\+|-)\d+', num).group()
sign = exp_search[1]
exp = int(exp_search[1:])
new_exp = exp + 1
exponent = 'E'+sign+'{:02}'.format(abs(new_exp))
# move decimal place over
sig_search = re.search(r'-?\d\.\d+', num).group()
stripped = sig_search.replace('.', '')
if stripped[0] == '-':
significand = stripped.replace('-', '-.')
else:
significand = '0.' + stripped
# glue significand and exponent back together
new_num = significand + exponent
print('{:>20}{:>20}'.format(num, new_num))
assert float(num) == float(new_num)
输出:
-2.802479940E+00 -.2802479940E+01
3.796137791E+00 0.3796137791E+01
-1.200000000E-02 -.1200000000E-01
3.500000000E-02 0.3500000000E-01
0.000000000E+00 0.0000000000E+01
1.000000000E+02 0.1000000000E+03
-2.000000000E+02 -.2000000000E+03
这不会执行任何算术,只执行字符串操作,因此不应该引入浮点表示或其他任何问题。
答案 2 :(得分:0)
要将任何数字转换为科学记数法,您需要知道两个指标,即指数和小数部分。像这样:Number = Dec E exponent(或Number = Dec * 10 ^ exponent)
Log10()函数将非常重要,因为它将为您提供Number的精确指数!然后得到指数你有这种关系:
exponent = log10(Number/Dec)
但不知道Dec部分,我们将简化为这种关系:
exponent = log10(Number)
这不会给出整数指数,只有指数为1/10 ^ exponent = Number。要获得正确的整数指数,您需要使用floor()函数获得第一个最小的整数 这就是为什么您需要将关系更改为:
exponent = int(floor(log10(Number))) # using int will convert any floating value into an integer exponent
然后使用此指数,您可以轻松找到具有以下关系的小数部分:
Dec = Number / 10^exponent
现在你有办法将任何数字*改为科学记数法,如果你需要一个前导零,那么你只需要递减指数^^ * Log(x)是在R * +上定义的,所以如果你有一个负数,你必须把它作为参数传递给log10(),然后如果数字为0,那么你应该做一个例外(返回dec = 0和exponent = 0)
这是python中的代码示例:
Decompose(originalvalue):
calcul = originalvalue;
if (originalvalue != 0.0):
if (originalvalue < 0):
calcul = -calcul;
exponent = int(floor(log10(calcul))); # get the integer exponent
value = originalvalue / 10.0**exponent; # get scientific decimal part
# then to have a leading zero, you just have to verifiy if dec >= 1 or not, and in this case, modify the value and exponent to eliminate it.
if (value >= 1):
value *= 10**-1
exponent += 1
else:
exponent = 0;
value = 0.0;
return [value, exponent];
答案 3 :(得分:0)
这是我提出的解决方案,遇到同样的问题。
def converter(number):
number_str = '{:.14e}'.format(number)
number_split = number_str.split('.')
int_part = number_split[0]
exp_part = number_split[1][-3:]
dec_part = number_split[1][:-6]
int_part_numeric = int(int_part)
if number == 0:
return '0.000000000000E+00'
if int_part_numeric == 0:
sign = '0'
new_exp_part = exp_part
new_dec_part = dec_part
elif int_part_numeric < 0:
sign = '-'
new_exp_part = '{:+03d}'.format(int(exp_part) + 1)
new_dec_part = int_part.strip('-') + dec_part[:-1]
elif int_part_numeric > 0:
sign = '0'
new_exp_part = '{:+03d}'.format(int(exp_part) + 1)
new_dec_part = int_part + dec_part[:-1]
return sign + '.' + new_dec_part + 'E' + new_exp_part
虽然可能会简化一点......