小数点的python问题

时间:2014-11-10 20:08:17

标签: python

我在其他数字系统中为十进制数写了一个transfomator。逗号的数字是正确的,但逗号后的小数位是假的。我会发布我的代码,但变量是德语,所以我希望你能读懂它们

这里是留给逗号的代码(没错)

print "decimal numbers to another number system between [2-9]\n"
decimal = float(raw_input("put in a float: "))
base = int(raw_input("base: "))

#declaration for first part
decimalnew = decimal  # we need this var for the second part
result = 0
number = int(decimal) / 1
factor = 1


# first part for integers decimal is always an integer (this part is ok)
while (decimal):
	leftover = int(decimal) % base
	decimal = int(decimal) / base
	
	factor *= 10
	result = result + leftover * factor

#declaration for second part
decimalnew = decimalnew - number
result2 = 0
factor2 = 1

# second part for floats always < 1 (f.e. 0.2)


# i think in this part is the mistake
while (decimalnew > 0):
	leftover2 = decimalnew * base
	decimalnew = decimalnew * base
	if (decimalnew > 0):
		decimalnew = decimalnew - leftover2	
	factor2 = factor2 * 10
	result2 = result2 + leftover2 / factor2

# results from the first part and the second part
finalresult = result + result2


print "eingegebene Zahl", number, "- neue Zahl mit der Basis %d =" % (base) , finalresult/10

2 个答案:

答案 0 :(得分:0)

减法是错误的。 dezimalnew == rest2,如果仔细查看作业,那么它将给出0。

我要说的是,您可能需要查看如何将十进制浮点数转换为任何基数。一般的想法是,一旦你有0.1例(浮动部分),你想要保持乘以基数并将新结果的INTEGER部分添加到转换后的数字,然后只保留新的小数部分。 例如,0.1到3给出0.002200...,因为: 0.1 * 3 = (0).3 * 3 = (0).9 * 3 = (2).7, 0.7 * 3 = (2).1, 0.1 * 3 = 0.3...

答案 1 :(得分:0)

首先,由于您只使用0-9个数字,因此无法处理大于10的基数。

但是你有一些小数部分的问题。首先,即使它有效,你的algorythme也有很大的机会打破,因为它可以导致无限的价值。

作为一个简单的例子:基础4中的0.1给出无限值:0.0121212 ..

所以你必须首先添加另一个问题以获得最大精度来阻止最终的无限循环,接下来必须重写小数部分的算法。

以下内容应该有效:

print "reeller Dezimal-Konvertierer\n"
dezimal = float(raw_input("Bruchzahl eingeben: "))
basis = int(raw_input("Basis eingeben: "))
dezpos = int(raw_input("Maximal precision: ")) # don't know how to spell it in german

dezimalneu = dezimal
ergebnis = 0
zahl = int(dezimal) / 1
faktor = 1

while (dezimal):
    rest = int(dezimal) % basis
    dezimal = int(dezimal) / basis

    faktor *= 10
    ergebnis = ergebnis + rest * faktor

dezimalneu = dezimalneu - zahl
ergebnis2 = 0
faktor2 = 1

while (dezimalneu > 0) and dezpos > 0:
    print dezimalneu
    dezimalneu *= basis
    faktor2 *= 10
    i = int(dezimalneu)
    ergebnis2 = ergebnis2 *10 + i
    dezimalneu -= i
    dezpos -= 1

ergebnis2 = 1.0 * ergebnis2 / faktor2
ergebnisfinal = ergebnis + ergebnis2

print "eingegebene Zahl", zahl, "- neue Zahl mit der Basis %d =" % (basis) , ergebnisfinal/10

(我保留了德语变量名称,因为我在翻译之前已经开始写它了)