2011-03-28 75 views
2

首先关闭所有,感谢您的关注,我是新来这个网站^^所以原谅我,如果我做错了什么......向下移动点在浮点数

我有一个巨大的问题用我的Python代码......我是编程新手,也是Python的新手。

我需要一个浮点数和移动点权,使其成为一个整数,比如到60.27并获得6027.

,我使用递归倍增num*10直到num%2==0的算法,然后让int(num)

的问题是,当我乘(例如)602.47*10返回6024.700000000001,它显然不:-)

工作有没有什么办法解决它,或任何其他技术或其他的方式做这个递归?我可以使用我需要的任何东西,但它必须是递归的:否forwhile ...

感谢您的帮助!我的第一语言不是英语,所以我请你原谅,如果它很难读...

回答

1

你可以尝试这样的:

x = 60.27 
newx = int(str(x).replace('.','')) 

编辑:作为一个侧面说明,串.replace.translate有各种大小的花车

%timeit int(str(4.73285).replace('.','')) 
100000 loops, best of 3: 2.65 us per loop 

%timeit int(str(4.73285).translate(None, '.')) 
100000 loops, best of 3: 3.02 us per loop 
+0

谢谢!最后我用.replace,'因为性能不会真的成为问题^^ – dhcarmona 2011-04-04 16:42:54

2

浮点表示有这个问题。

您是否在寻求改变:

1.2345 
12.345 
123.45 
1234.5 

所有12345?

对于没有精确表示(你提到6024.70)的浮点数,你是否期望得到6024700000000001,因为这是最接近6024.70的输出,它可以存储在float中?

+0

这正是我不得不^^,其他建议我解析它作为一个海峡,只需去除浮点...感谢的问题! – dhcarmona 2011-04-04 16:44:17

1

将数字解析为字符串并进行字符串操作将是更可靠的算法。正如你目睹的那样,涉及浮点数的任何数值计算都是不准确的。有没有这样做。

+0

感谢您的帮助,^^这就是我最终使用的,将数字解析为str并使用.replace,如其他人所建议的那样...谢谢! – dhcarmona 2011-04-04 16:40:05

2
>>> str(60.27).translate(None, '.') 
'6027' 

使用lstrip('0')防范小数低于1


从文档:

S.translate(表[,deletechars]) - >串

返回字符串的副本S,其中可选参数deletechars发生 所有字符被删除,剩下的 字符已经通过给定的 转换表映射,它必须是长度为256

+0

也适用于科学计数法中的数字。 – 2011-03-28 18:57:13

+0

谢谢!我用.replace,但是这个.translate方法好像非常非常有用^^ – dhcarmona 2011-04-04 16:41:47

1

的字符串,因为你不能(可靠)使用浮点做你想做的,容易被破解的数字转换为字符串,然后撕裂了小数点:

int(str(num).replace('.','')) 

将与未在科学表示的任何数量的工作符号。如果你的数字很大(或很小),最终以科学计数法表示,请看this

+0

非常感谢!这正是我需要的... – dhcarmona 2011-04-04 16:40:25

1

只是采取了野生刺相似的性能在这里黑暗中,但是你的数字是否代表你想要在美元和美分之间进行转换的金额?如果是这样,您需要停止正在做的事情,并将的所有内容都转换为分,并且只在实际向用户展示内容时使用“美元”值。使用浮点数为货币值是一个非常非常糟糕的主意。

如果不是这样,不理我了:-)

+0

感谢您的帮助......其实,我想要做的是验证浮点数到某个基地,说:验证11.1112基地2将是假的,例如... – dhcarmona 2011-04-04 16:41:21