python - 将 float 舍入为 n 位,忽略前导零并保留它们

标签 python decimal rounding

浮点 = 11.0000123456789

我想将上面的 float 舍入为 11.00001235。因此,我希望 float 的基数部分四舍五入为 4 位数字,同时忽略并保留前导零,并在末尾添加回有效数字。

我有以下内容,它简短而甜蜜,但感觉有点像解决方法。

import decimal

decimal.getcontext().prec = 4
significand, base = str(11.0000123456789).split('.')
fp = significand + str(decimal.Decimal('.' + base) + 0)[1:]  # I need to add 0 here for it to work
print(fp)

我确实无法找到我的具体问题的答案。我想知道实现这一目标的最 Pythonic 方法是什么,或者我所拥有的是否足够好。我感觉有点粗制滥造。

编辑:前导零的数量未知,我选择了四个作为示例。所以我认为字符串格式化不起作用。

最佳答案

我认为这是解决你的问题的最Pythonic的方法。试试这个,

>>> import re
>>>
>>> float_val = 11.0000123456789
>>> keep_places = 4
>>>
>>> regEX = f'[0-9]+\.[0]+{"[0-9]" * keep_places}'
>>> expected_val = re.search(regEX, str(float_val)).group()
>>>
>>> print(expected_val)
'11.00001234'

最简单的方法是创建 Regular expression operations,这就是我使用它来解决您的问题的方法。让我们将其分为 4 部分。

  1. [0-9]+
  2. \.
  3. [0]+
  4. [0-9] * keep_places

(1)。 [0-9] 表示仅选择 0 到 9 之间的一位数字。小数点前需要多位数字。这就是我们添加 [0-9]+ 的原因。如果小数点前没有任何整数,则添加 * 而不是 + ,它会检查零次或多次出现。如果您使用 + 意味着您必须有一个或多个值。

(2)。 . 这个点是一个特殊字符,用于从给定字符串中选择除换行符之外的任何字符。我们需要捕获小数点,它也是一个点。如果我们的字符串有这些特殊字符(在我们的例子中是小数点),我们使用 \ 来匹配这些字符。这就是我们使用 \. 的原因,它现在可以匹配我们的小数点。

(3)。 [0]+ ,这将匹配字符串中的所有零。

(4)。 [0-9] * keep_places ,这只是一个字符串乘法。对于这个问题 keep_places4 这意味着我们得到这种输出 [0-9][0-9][0-9][0-9] 。但在 Regular expression operations 中,它仅选择四位数字,每个数字都在 0 到 9 之间。还有一件事,对于这个问题,您使用 [0-9][1-9] 并不重要。因为我们已经捕获了零,所以它开始从 1 中查找其他整数。

如果你打印 regEX ,你会看到 [0-9]+\.[0]+[0-9][0-9][0-9][0-9] 类型的字符串。它仅匹配 <any_number><dot><all_zeros_before_the__non_zero_integer><4_digit_after_last_zero> 类型的模式。您可以测试这个表达式 online

关于python - 将 float 舍入为 n 位,忽略前导零并保留它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56776723/

相关文章:

MySQL:使用 char(n) 与带有零填充的十进制(n)

圆形但 0.5 应该是地板

python - 将列表转换为元组的分组列表?

python - 在 Python 中,如何根据 ColA 值向 ColB 分配值?

python - 为日期解析文本字符串——不是标准的转换问题!

c# - Entity Framework 从 SQL Server View 返回损坏/交换数据

boost 多精度 cpp_dec_float 仅与所需精度进行比较

python检查url类型

delphi - 小数舍入和打印机选择

Java 四舍五入问题