Python 获取浮点数的最低有效位(不使用字符串操作)

3 投票
3 回答
2792 浏览
提问于 2025-04-16 15:34

假设我有一个浮点数12345.6789,我想用位运算在Python(2.6版本)中获取它的六个最不重要的数字,也就是45.6789,最后得到一个整数456789。

我该怎么做呢?

谢谢

PS 我不想使用字符串操作,尽管那样会比较简单:对于任何浮点数f:

int(str(int(f * 1000))[-10:])

编辑:这个原始问题其实没什么意义,评论中也提到了这一点。非常抱歉……下面展示了如何在不使用字符串的情况下获取最不重要的数字的方法(使用整数和取模运算)

3 个回答

2
>>> int(12345.6789*10000)%1000000
456789

但那不是 位运算

3

关于你的字符串解决方案,有一点很重要,那就是在Python 2.7中,浮点数的显示算法发生了变化:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
>>> 12345.6789
12345.678900000001

Python 2.7.0+ (r27:82500, Sep 15 2010, 18:04:55) 
>>> 12345.6789
12345.6789

不管你用哪种方式,浮点数的精度到底是多少,这个问题总是让人困惑。比如说,你的算法接收到一个浮点数1.23。那这个数字的精度是多少呢?也许它实际上是以1.230的形式存储的,只是最后的零没有显示出来。所以你需要知道你希望保留小数点后多少位数字。

另外,位运算是不能直接用于浮点数的:

>>> 12345.6789 << 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'

因此,你必须先把浮点数乘以你已知的精度,然后再使用取模运算(%),正如其他人所建议的那样。

6
>>> a = 12345.6789
>>> b = int(a*10000)
>>> b
123456789
>>> c = b % 1000000
>>> c
456789

但是 - 为什么呢??

撰写回答