如何在不重复转换代码的情况下将所有浮点数转换为两位小数而不考虑浮点数的小数位数?

How to convert all floats to two decimal places regardless of number of decimal places float has without repeating convert code?

目标

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

比如我要转换

5050.00

50.550.50

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

不是这个问题的内容

这个问题不是关于:

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

  2. 小数点下限或上限。

  3. 小数点四舍五入。

此问题与 this 问题不重复。

That question only answers the first part of my question - convert floats to two decimal places regardless of number of decimal places float has, not the second part - without repeating convert code.

也没有this问题。

That is just how to add units before the decimal place. My question is: how to convert all floats to two decimal places regardless of number of decimal places float has without repeating convert code.

研究

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

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

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

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

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

澄清

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

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

使用这个功能。

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

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

浮点数在内部用 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 使用,即 [=42] =]不是人类可读的。在任何时候你想“看到”这个数字,你必须把它转换成文本。只是 some 隐式调用它,如 print(myvar)。然后,只需在这些地方显式转换它 - `print(f"{myvar:.02f}").

内存中确实有 2 位小数

如果您使用 decimal.Decimal,那么是的,有一些方法可以将数字的内部表示保留为 2 个小数位, 但是他们,你 必须 将其转换为所有 输入 上的“小数点后两位”值 =18=]

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

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


你可以修改小数精度,即使你在2个小数类型之间进行任何操作

import decimal
from decimal import Decimal

decimal.getcontext().prec = 2

a = Decimal('0.12345')
b = Decimal('0.12345')

print(a + b)

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