【问题标题】:How to convert all floats to two decimal places regardless of number of decimal places float has without repeating convert code?如何将所有浮点数转换为两位小数,而不管浮点数有多少小数位,而无需重复转换代码?
【发布时间】:2022-01-18 16:37:22
【问题描述】:

目标

我想将所有浮点数转换为两位小数,而不管浮点数有多少位无需重复转换代码

比如我要转换

5050.00

50.550.50

无需一次又一次地重复转换代码。我的意思将在下一部分进行解释 - 研究。

不是这个问题的目的

这个问题不是关于:

  1. 仅将浮点数限制为两个小数点 - 如果小数点少于两个,那么我希望它有两个小数点,未使用的空格为零。

  2. 小数点下限或上限。

  3. 四舍五入。

此问题与this 问题不重复。

该问题仅回答了我的问题的第一部分 - 将浮点数转换为两位小数,无论浮点数有多少小数位,而不是第二部分 - 无需重复转换代码。

也不是this问题。

这就是如何在小数位前添加单位。我的问题 是:如何将所有浮点数转换为小数点后两位 浮点数的小数位数,无需重复转换代码。

研究

我找到了两种实现转换的方法。一种是使用decimal 模块:

from decimal import *
TWOPLACES = Decimal(10) ** -2
print(Decimal('9.9').quantize(TWOPLACES))

另一个,不使用任何其他模块:

print(f"{9.9:.2f}")

但是,这并没有完全回答我的问题。意识到要转换的代码需要不断重复吗?我一直不得不重复代码来一次又一次地转换。可悲的是,我的整个程序已经快完成了,在这里和那里添加这段代码会很浪费时间,所以格式是正确的。有没有什么方法可以将所有浮点数转换为两位小数,而不管浮点数有多少而无需重复转换代码

澄清

我所说的转换的意思是,就像Dmytro Chasovskyi 所说的那样,我希望我的程序中所有带有浮点数的地方在没有额外更改的情况下开始像小数一样运行。例如,如果我有操作1.2345 + 2.7 + 3 + 56.1223183,它应该是1.23 + 2.70 + 3.00 + 56.12

另外,float 是一个数字,而不是一个函数。

【问题讨论】:

  • 转换是什么意思?您是否希望程序中所有带有浮点数的地方在没有额外更改的情况下都开始像小数一样运行?例如,你有操作 1.2345 + 2.7 + 3 + 56.1223183,它们应该是 1.23 + 2.70 + 3.00 + 56.12?
  • 另外,问题是你如何使用浮点数?它是 float 函数还是只是一个数字 2.5678?
  • @DmytroChasovskyi 是的,这正是我的目标。
  • 如果您想花一点时间创建一个 float 的子类来完成所有转换,这可能是您项目早期的一个不错的实现,我不确定您是否愿意立即实施。

标签: python decimal


【解决方案1】:

坏消息是:没有“两位小数”的“浮点数”。

浮点数在内部用 base 2 中的固定位数表示。 https://floating-point-gui.de/basic/.

对于我们使用任何现代程序执行的几乎所有计算,这些都足够高效和准确。

我们通常想要的是一个数字的人类可读文本表示,在程序的所有输出中,只显示两位数字。这可以在您的程序将值写入文本文件、屏幕或将其呈现为 HTML 模板(再次“将其写入文本文件”)的任何位置进行控制。

因此,将数字转换为文本的相同语法嵌入另一个字符串中,还允许控制数字的确切输出。您以print(f"{9.9:.2f}") 为例。唯一看起来不切实际的事情是由于您对号码及其转换进行了硬编码。通常,数字将在变量中。

他们,你所要做的就是写,无论你在哪里输出数字:

print(f"The value is: {myvar:.02f}")

而不是

print(f"The value is: {myvar}")

或者在你调用的任何函数中都需要数字的渲染版本而不是打印。请注意,此处使用“渲染”一词是故意的:当您的程序运行时,该数字以一种有效的方式存储在内存中,CPU 可以直接使用,即人类可读。在任何时候你想“看到”这个数字,你必须把它转换成文本。只是 some 隐式调用它,例如print(myvar)。然后,只需在这些地方显式转换它 - `print(f"{myvar:.02f}")。

内存中确实有 2 个小数位

如果你使用decimal.Decimal,那么是的,有办法保持数字的内部表示为 2 个十进制数字, 但是他们,您必须将其转换为所有输入上的“2位小数”值,而不是仅仅转换输出数字

这意味着每当将一个数字摄取到您的程序中,无论是用户键入的、从二进制文件或数据库中读取的,还是通过传感器从传感器接收到的,您都必须应用类似的转换为上面详述的输出中使用的那个。更准确地说:您将浮点数转换为格式正确的字符串,然后将其转换为decimal.Decimal

这将防止您的程序由于基本转换而累积错误,但您仍需要在每个输出上强制格式为 2 位小数,就像上面一样。

【讨论】:

    【解决方案2】:

    使用此功能。

    def cvt_decimal(input):
        number = float(input)
        return ("%.2f" % number)
    
    print(cvt_decimal(50))
    print(cvt_decimal(50.5))
    

    输出是:

    50.00
    50.50
    
    
    ** Process exited - Return Code: 0 **
    Press Enter to exit terminal
    

    【讨论】:

      【解决方案3】:

      您可以修改小数精度,即使您在两种小数类型之间进行任何操作

      import decimal
      from decimal import Decimal
      
      decimal.getcontext().prec = 2
      
      a = Decimal('0.12345')
      b = Decimal('0.12345')
      
      print(a + b)
      

      十进制计算是精确的,但计算需要更多时间,请记住这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-06
        • 2022-11-17
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 2016-08-05
        相关资源
        最近更新 更多