在浮点数中向下移动小数点

2 投票
6 回答
2090 浏览
提问于 2025-04-16 14:35

首先,非常感谢大家的关注,我是这个网站的新手^^ 如果我做错了什么,请多多包涵...

我在我的Python代码上遇到了一个大问题... 我刚开始学习编程,也刚开始学习Python。

我需要把一个小数点数的点往右移动,让它变成一个整数,比如把60.27变成6027。

我现在用的算法是递归地把 num*10,直到 num%2==0,然后再取 int(num)

问题是,当我乘以(比如说) 602.47*10 时,它返回的是 6024.700000000001,显然这样是不行的 :-)

有没有什么办法可以解决这个问题,或者有什么其他的技巧或者方法可以递归地做到这一点呢?我可以使用任何我需要的东西,但必须是递归的:不能用 forwhile ...

谢谢大家的帮助!!我的母语不是英语,所以如果读起来有点困难,请多多包涵...

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

撰写回答