【问题标题】:How to convert exponent in Python and get rid of the 'e+'?如何在 Python 中转换指数并去掉“e+”?
【发布时间】:2020-10-26 02:09:07
【问题描述】:

我从 Python 开始,最近遇到了一个具有大值的数据集。 我的一个字段有一个如下所示的值列表:1.3212724310201994e+18(注意数字末尾的e+18)。

如何将其转换为浮点数并删除指数而不影响值?

【问题讨论】:

  • pd.to_numeric?
  • 不清楚是什么问题。像 n.nnnnne+nnn 这样的数字可以读取为普通浮点数——从输入解析器的角度来看,它与 n.nnnnnn 是同一种数字。也许你可以多说一些你正在尝试做的事情。
  • @QuangHoang 没用。
  • 只是为了让它们看起来不同吗?因为它不会影响您对它们所做的任何事情

标签: python pandas


【解决方案1】:

您可以将decimal 模块中的Decimal 用于数据的每个元素:

from decimal import Decimal

s = 1.3212724310201994e+18

print(Decimal(s))

输出:

1321272431020199424

【讨论】:

    【解决方案2】:

    首先,数字已经是一个浮点数,你不需要改变这个。唯一的问题是您希望更好地控制如何将其转换为字符串以用于输出目的。

    默认情况下,超过一定大小的浮点数使用指数表示法转换为字符串(“e”代表“*10^”)。但是,如果要将其转换为不带指数表示法的字符串,则可以使用f 格式说明符,例如:

    a = 1.3212724310201994e+18
    
    print("{:f}".format(a))
    

    给予:

    1321272431020199424.000000
    

    或在 Python 3 中使用“f-strings”:

    print(f"{a:f}")
    

    这里的第一个 f 告诉它使用 f 字符串,:f 是浮点格式说明符。

    您还可以指定应显示的小数位数,例如:

    >>> print(f"{a:.2f}")   # 2 decimal places
    1321272431020199424.00
    
    >>> print(f"{a:.0f}")   # no decimal places
    1321272431020199424
    

    请注意,Python 中浮点数的内部表示使用 53 位二进制精度(大约 10^16 的一部分),因此在这种情况下,您的数量值大约 10^18 不是精确存储到最接近的整数,更不用说任何小数位了。但是,上面给出了如何控制用于字符串转换的格式的一般原则。

    【讨论】:

    • 你知道为什么在我们的两个答案中都有一个尾随 24 而不是 00 吗?
    • @AnnZen 毫无疑问,因为浮点数中没有足够的精度位来区分这些。
    • 是的,我只是觉得奇怪的是,它不是随机数,而是24
    • @AnnZen 这大概是使用可用位存储的任何精确二进制值的(部分)十进制表示。
    • @AnnZen 我看到1 << sys.float_info.mant_dig 大约是 9e15,与 1.3e18 相比......顺便说一句,如果你不介意我说,我认为这个问题更多的是关于OP 对浮点数如何在 Python 中工作的一般理解,而不是在这种情况下需要任意精度的数字(这是 Decimal 提供的)。正如您所看到的,当数字被存储为浮点数时,有效地转换为Decimal 为时已晚,因为舍入(二进制)已经发生了。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多