如何在Python中索引浮点数?

3

我正在寻找一个问题的答案,但无论搜索多少次都无法解决。

如果...

a = 1.23

我希望能将数字1乘以一个小数0.23,该如何实现呢?

谢谢您的帮助!


1
为什么你称这个操作为“索引”?听起来像是你在考虑选择和操作数字的字符串表示的部分。如果是这样,你需要停止以文本形式思考数字,并开始思考数值运算。在这里,看起来你想要向下取整或向零取整。 - user2357112
你的实际问题非常难以检测 - Wolf
5个回答

2

在munkhd的回答评论中,您说:

我希望能够输入一个小时值,然后将其转换为分钟。因此,如果是1.20,我会将1乘以60再加上20。我相信一定有更简单的方法:)

因此,您的程序将作为字符串接收1.20。因此,您可以对其使用字符串方法,例如

>>> dotted_time = '1.20'
>>> h, m = [int(s) for s in dotted_time.split('.')]
>>> print h, m
1 20
>>> minutes = 60*h + m
>>> hours = minutes / 60.0
>>> print minutes, hours
80 1.33333333333

另外,您可以执行 colon_time = dotted_time.replace('.', ':'); colon_time 的格式适用于标准时间函数,能够为您理解和操作。这可能是更加明智的方式,并且它可以轻松处理带有秒的时间,比如 '1.20.30',.replace('.', ':') 将其转换为 '1:20:30'。


1
在注释中检测实际问题是一项艰苦的工作 ;) (+1) - Wolf

1

除了PM 2Ring的答案似乎解决了[1]你实际的问题,你也可以“索引浮点数”,当然在将其转换为字符串后,但要注意有限的精度。因此,请使用内置的round函数来定义您的解决方案所需的精度:

s = str(round(a, 2)) # round a to two digits

现在,您可以对它应用所有的字符串函数。之后,您可能需要将结果转换回floatint类型...


[1]其他人已经建议过了:在像Python这样的高级语言中处理常见模型,如时间,应该期望得到已经存在的可靠解决方案的支持。


0

modf() 和 round()

使用 modf() 函数获取整数和小数部分。 modf() 将返回一个元组,包含(小数,整数)。 使用 round() 函数来控制答案的精度。

>>> import math
>>> a = 1.23
>>> math.modf(a) (0.22999999999999998, 1.0)
>>> math.modf(a)[0] #the zeroth location of the tuple is the fractional part
0.22999999999999998 # some precision lost, use round() to fix
>>> round(math.modf(a)[0], 2)
0.23 # This is an exact match the source fractional part

此外,如果您想索引浮点数的每个特定部分,可以使用以下代码:
def get_pos_float(num, unit, precision=3):
    if unit >= 10:
        num = abs(round(math.modf(num)[0], 3)) # Get just the fractional part
        num *= 10 # Move the decimal point one place to the right
        return get_pos_float(num, unit/10)
    retVal = int(math.modf(num)[1]) #Return the whole number part
    return retVal

它的使用方式如下:

>>> get_pos_float(1.23, 10)
2
>>> get_pos_float(1.23, 100)
3

0

你是否正在寻找int()

In [39]: a = 1.23

In [40]: int(a)
Out[40]: 1

In [41]: a
Out[41]: 1.23

a-int(a) 0.22999999999999998,它四舍五入为0.23
- g4ur4v
我认为他想要的更像是(somefloat.integerpart * N + somefloat.fractionalpart)。例如,当您通过虚拟乘以6时,1.23变成了6.23。 - Kevin

0

你不能像索引一个集合一样索引浮点数。关于浮点数的工作原理,可以阅读http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html获取更多信息。

数学库提供了一种获取该数字两个部分元组的方法。

>>> import math
>>> a = 1.23
>>> math.modf(a)
(0.22999999999999998, 1.0)

这并不准确,因为浮点数的表示方式,但是值大约在1e-17的数量级。

当然,这也是可能的...

>>> map(int, str(a).split('.'))
[1, 23]

这看起来像是我正在寻找的东西。为了准确解释我的操作,我想输入一个小时的值,然后将其转换为分钟。因此,如果是1.20,我会将1乘以60再加上20。我相信一定有一种更简单的方法 :) 对于格式不好造成的困扰,非常抱歉,这是我第二次提问,正在努力适应该网站。 - Adam Spaniels
4
如果你在处理时间,你应该绝对地使用时间模块,而不是试图将浮点数强制转换为奇怪的时间表示法。 - munk
1
如果您想进行时间算术运算,应该使用专门设计用于此目的的 timedelta 对象。'import datetime as dt; dt.timedelta(hours=1, minutes=20).seconds // 60` - b10n

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