【问题标题】:In python, how do I preserve decimal places in numbers? [duplicate]在python中,如何保留数字中的小数位? [复制]
【发布时间】:2014-02-08 22:49:35
【问题描述】:

我想在函数之间传递数字,同时保留数字的小数位。

我发现如果我将像“10.00”这样的浮点数传递给函数,那么小数位就不会被使用。这会弄乱计算百分比之类的操作。

例如,x * (10 / 100) 将始终返回 0。 但如果我设法保留小数位,我最终会做 x * (10.00 / 100)。这会返回一个准确的结果。

我希望有一种技术能够在我处理小数位可以保持零的数字时保持一致性。

【问题讨论】:

  • 另外,我认为你错了。如果你传递一个浮点数,它将像一个浮点数一样使用。 IMO 你在那里传递了一个 int。
  • 只要有一个浮点数,Python 2 就会进行浮点数除法,所以在调用函数时应该明确指定.0。除非另有明确说明,否则 Python 3 总是执行浮点除法。

标签: python


【解决方案1】:

当你写作时

10 / 100

您正在执行整数除法。那是因为两个操作数都是整数。结果是0

如果要执行浮点除法,请将其中一个操作数设为浮点值。例如:

10.0 / 100

float(10) / 100

请注意

10.0 / 100

导致二进制浮点值和二进制浮点数据类型不能代表0.1的真实结果值。因此,如果您想准确地表示结果,您可能需要使用十进制数据类型。 decimal 模块具有所需的功能。

【讨论】:

    【解决方案2】:

    Python 2.x 将在两个整数相除时使用整数除法,除非你明确告诉它不这样做。输入两个整数 --> 输出一个整数。

    Python 3 及以上版本将返回,引用 PEP 238 http://www.python.org/dev/peps/pep-0238/ 除法近似结果的合理近似值,即它将执行浮点除法并返回结果而不进行舍入。

    要在早期版本的 Python 中启用此行为,您可以使用:

    from __future__ import division
    

    在模块的最顶部,这应该会为您提供所需的一致结果。

    【讨论】:

      【解决方案3】:

      您应该使用decimal 模块。每个数字都知道它有多少个有效数字。

      【讨论】:

        【解决方案4】:

        floatint 在 python 中的划分工作方式不同,看看这个问题及其答案:Python division

        此外,如果您正在寻找将数字的十进制浮点格式化为字符串的解决方案,您可能需要使用%f

        Python

        # '1.000000'
        "%f" % (1.0)
        
        # '1.00'
        "%.2f" % (1.0)
        
        # '  1.00'
        "%6.2f" % (1.0)
        

        【讨论】:

          【解决方案5】:

          如果您想保留有效数字,decimal 模块可以满足您的一切需求。示例:

          >>> from decimal import Decimal
          >>> num = Decimal('10.00')
          >>> num
          Decimal('10.00')
          >>> num / 10
          Decimal('1.00')
          

          【讨论】:

          • 一个更戏剧化的例子:str(Decimal(time.time()))
          • @bahmait 是的,这很有趣。我试图传达的一点是它保持了有效数字的概念。即,如果您输入10.00,它将与10.010.000 区分开来。正如您所指出的,任何直接转换为 Decimal 的浮点数都会给您带来无用的长结果。试试Decimal(0.1)
          猜你喜欢
          • 1970-01-01
          • 2014-09-03
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 2022-12-07
          相关资源
          最近更新 更多