将Double转换为值数字和指数

时间:2009-06-15 10:18:25

标签: math

对于前。

double size = 10.35;

我应该

value = 1035;

指数= -2;

所以当我重新计算时,我会得到10.35。

即1035 * 10 ^ -2 = 10.35;

请帮帮我。 提前致谢

3 个答案:

答案 0 :(得分:2)

一般来说,这是不可能的,因为double的小数部分存储在2的幂中,并且可能匹配或不匹配10的幂。

例如:当看2的幂与3的幂时:就像1/2 == 2 ^ -1 == 5 * 10 ^ -1有匹配,1/3 == 3 ^ -1 == ??没有匹配。

但是,你可以近似它。

如果你要求2的权力,它会有答案。在这种情况下,您可以查看双重表示(请参阅IEEE-754 here)并提取正确的位。

答案 1 :(得分:0)

非常简单(在C#中):

        double size = 10.36;
        int power = 0;
        while (size != (int)size)
        {
            size *= 10.0;
            power--;
        }
        Console.WriteLine("{0} * 10 to the {1}", size, power);

虽然我确信更多的想法可以找到更优雅的解决方案。

这不是另一种方式,你有一个大数字(103600说),并希望得到一些功率(1036 * 10 ^ 2)的最小值。

答案 2 :(得分:0)

我必须做一些非常相似的事情。这是Python的解决方案(它还没有经过良好的测试):

def normalize(value, fdigits=2):
    """
    Convert a string representing a numerical value to value-digit/exponent form. 
    Round the fractional portion to the given number of digits.

    value    the value (string)
    fdigits  the number of digits to which to round the fractional 
             portion
    """

    # if empty string, return error
    if not value:
        return None

    # split value by decimal
    v = value.split('.')

    # if too many decimals, return error
    if len(v) > 2:
        return None

    # add empty string for fractional portion if missing
    elif len(v) == 1:
        v.append('')

    # assign whole and fractional portions
    (w, f) = v

    # pad fractional portion up to number of significant digits if necessary
    if len(f) < fdigits:
        f += ('0' * (fdigits - len(f)))

    # if the number of digits in the fractional portion exceeds the
    # number of digits allowed by fdigits
    elif len(f) > fdigits:
        # convert both portions to integers; use '0' for whole portion if missing
        (wi, fi) = (int(w or '0'), int(f[:fdigits]))

        # round up if first insignificant digit is gteq 5
        if int(f[fdigits]) >= 5:
            fi += 1

            # roll whole value up if fractional portion rounds to a whole
            if len(str(fi)) > fdigits:
                wi += 1
                fi = 0

        # replace the whole and fractional strings
        (w, f) = (str(wi), ("%0" + str(fdigits) + "d") % fi)

    # derive value digits and exponent
    n = w.lstrip() + f

    l = len(n)
    x = -fdigits

    n = n.rstrip('0')
    x += (l - len(n))

    # return value digits and exponent
    return (int(n), x)