python - 将浮点数舍入为 n 位,忽略前导零并保留它们
问题描述
浮点数 = 11.0000123456789
我想将上面的浮点数四舍五入为 11.00001235。因此,我希望浮点数的基数部分舍入为 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'
最简单的方法是创建正则表达式操作,这就是我使用它来解决您的问题的方式。让我们把它分成4个部分。
[0-9]+
\.
[0]+
[0-9] * keep_places
(1)。[0-9]
意思是在 0 到 9 之间只选择一位。我们需要在小数点前多位。这就是我们添加[0-9]+
. 如果小数点前没有任何整数,则添加*
而不是+
,它会检查零次或多次出现。如果您使用+
均值,则必须具有一个或多个值。
(2)。.
此点是一个特殊字符,用于从给定字符串中选择除换行符以外的任何字符。我们需要捕获也是一个点的小数点。如果我们的字符串有这些特殊字符(在我们的例子中是小数点),我们会使用\
这些字符来匹配这些字符。这就是我们使用 的原因\.
,它现在可以匹配我们的小数点。
(3)。[0]+
,这将匹配我们字符串中的所有零。
(4)。[0-9] * keep_places
,这只是一个字符串乘法。对于这个问题keep_places
,4
这意味着我们得到了这种输出[0-9][0-9][0-9][0-9]
。但是在正则表达式操作中,它只选择四个数字,每个数字在 0 到 9 之间。还有一件事,对于这个问题,你使用[0-9]
or并不重要[1-9]
。因为我们已经捕获了零,它开始从 中寻找其他整数1
。
如果你 print 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>
模式类型。你可以在线测试这个表达式。
推荐阅读
- python - 相同图像的两个副本上的图像减法不给出零矩阵?
- java - 为什么Java中的这段代码会进入无限循环?
- c++ - 在 If 条件下使用 Bool 向量二维数组
- kotlin - 按下按钮播放不同的 Youtube 视频 (Android)
- machine-learning - 在 CatBoost 中测量 AUPRC
- ruby-on-rails - 是否可以存根 ActiveRecord 的保存方法
- python - 使用 sys.stdin 读取文本文件
- listview - Flutter:在 http.get 请求之后构建 ListView
- java - JAVA:为什么我不能在同一垂直位置(不同的水平位置)有两个以上的 JLabel?
- regex - 如何使用正则表达式将“--------ab-c”之类的字符串修复为“ab-c”?