将十进制转换为特定的科学记数法格式

时间:2014-01-14 21:14:42

标签: python-3.x numbers

我正在尝试将十进制转换为特定的科学记数法格式:

-2.802479940 ==> -.2802479940E + 01 3.796137791 ==> 0.3796137791E + 01

等等。基本上,在负数和前导零上没有前导零 在正数上。我已经能够用大E科学记谱打印出来了 但不知道如何强制领导部分只是' - '或'0'。

4 个答案:

答案 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

虽然可能会简化一点......