在浮点数中向下移动小数点
首先,非常感谢大家的关注,我是这个网站的新手^^ 如果我做错了什么,请多多包涵...
我在我的Python代码上遇到了一个大问题... 我刚开始学习编程,也刚开始学习Python。
我需要把一个小数点数的点往右移动,让它变成一个整数,比如把60.27变成6027。
我现在用的算法是递归地把 num*10
,直到 num%2==0
,然后再取 int(num)
。
问题是,当我乘以(比如说) 602.47*10
时,它返回的是 6024.700000000001
,显然这样是不行的 :-)
有没有什么办法可以解决这个问题,或者有什么其他的技巧或者方法可以递归地做到这一点呢?我可以使用任何我需要的东西,但必须是递归的:不能用 for
或 while
...
谢谢大家的帮助!!我的母语不是英语,所以如果读起来有点困难,请多多包涵...
6 个回答
2
>>> str(60.27).translate(None, '.')
'6027'
使用 lstrip('0')
来防止出现小于1的数字。
来自文档:
S.translate(table [,deletechars]) -> string
这个方法会返回字符串 S 的一个副本,所有在可选参数 deletechars 中出现的字符都会被删除,剩下的字符会根据给定的翻译表进行转换,这个翻译表必须是一个长度为256的字符串。
2
浮点数表示法有这个问题。
你是想把:
1.2345
12.345
123.45
1234.5
全部改成12345吗?
对于那些不能精确表示的浮点数(你提到的6024.70),你是不是希望得到6024700000000001,因为这是最接近6024.70的浮点数存储结果?
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