对于前。
double size = 10.35;
我应该
value = 1035;
指数= -2;
所以当我重新计算时,我会得到10.35。
即1035 * 10 ^ -2 = 10.35;
请帮帮我。 提前致谢
答案 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)