在Python中如何将浮点数的整数部分和小数部分分离?

10

我正在努力将1英尺的价值转换为12英寸,以此计算人的身高(单位为英寸),例如:5.11意味着一个身高为5英尺11英寸的人总共有71英寸。请问是否有任何一种Python方法可以将浮点数的整数部分和小数部分分离以进行进一步计算?欢迎任何建议。


1
@AndrewWalker:除非在这种情况下,我们有一个XY问题,其中OP本来就不应该有一个数字。 - Eric
3个回答

27
要获取浮点数的整数部分,请使用内置的 int() 函数:
>>>int(5.1)
5

要分离浮点部分,请用整数减去浮点数:

>>>5.1 - int(5.1)
0.1

或者你可以用 1 取模浮点数来得到浮点数的余数部分 (即小数部分):

>>> 5.1 % 1
0.09999999999999964 #use the round() function if you want 0.1

3
% 解决方案在处理负数时会出现问题(例如:-5.1 % 1 == 0.9000000000000004)。 - Delgan

5

对于您来说,5.11 不是浮点数。如果是的话,它将意味着5.11英尺,即61.32英寸。

5.11 是一个包含两个数据和分隔符的字符串 - 就像解析一个字符串一样!如果您将分隔符更改为更传统的 '(即5'11),则很明显它不是一个单一的浮点数:

raw = raw_input("Enter feet'inches")
feet, inches = map(int, raw.split("'", 1))

感谢您的回答,它能够工作。 - Pradeep

1

另一种方法是使用divmod(函数或运算符),将数字1作为分母(除数):

>>> divmod(5.11, 1)
(5.0, 0.11000000000000032)

>>> 5.11.__divmod__(1.)
(5.0, 0.11000000000000032)

2
你永远不应该手动调用__divmod__ - Eric
1
@Eric,我看了一下,但没有找到...你能给我提供一个参考,为什么我不应该直接调用魔术函数__divmod__吗? - Hugo Corrá
2
你会使用 myList.__len__() 吗? - Eric
1
@Eric,谢谢!我很久以前就知道直接调用魔术函数是不正确的,但是在我非常谦虚的看法中,这取决于上下文,我看不出为什么不能直接为浮点数调用__divmod__。与len不同,divmod函数没有做任何特殊处理(对于某些错误类型,len会抛出异常)。 - Hugo Corrá
我想我的观点是,看到一个__method__会让人想到“这里发生了一些不寻常的事情”。不过你说得对,有时候也可以使用它 - 例如,在使用super时,这是唯一的方法:super(MyClass, self).__divmod__(other) - Eric
divmod比减去整数形式要快一点,这是目前流行的答案。 - fuzzyTew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接