将浮点数舍入为 n 位数字,忽略前导零并保留它们
Round a floating point number to n digits ignoring leading zeros and preserving them
浮点数 = 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 方法是什么,或者我所拥有的是否足够体面。我觉得有点粗制滥造。
编辑:前导零的数量未知,我为示例选择了四个。所以我认为字符串格式不会起作用。
编辑:对于未知数量的 0,我认为没有比
更好的选择了
import re
some_float = 11.00001203456789
how_many_to_keep = 4
regex = r"0[1-9]"
float_part = str(some_float).split(".")[1]
float_limiter = re.search(regex,float_part).start() if float_part.startswith("0") else -1
print(f'{some_float:2.{float_limiter+1+how_many_to_keep}f}')
是用表达式float_limiter+1+how_many_to_keep
实时计算0的个数,作为格式参数使用。这有点难看,但现在 returns 所有情况下的正确答案。输出是
11.00001235
我认为这是解决您的问题的最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 个部分。
[0-9]+
\.
[0]+
[0-9] * keep_places
(1)。 [0-9]
表示select只有0到9之间的一位数字。我们需要小数点前的多位数字。这就是我们添加 [0-9]+
的原因。如果小数点前没有任何整数,则添加 *
而不是 +
,它会检查零次或多次出现。如果您使用 +
意味着您必须有一个或多个值。
(2)。 .
这个点是 select 给定字符串中除了换行符以外的任何字符的特殊字符。我们需要捕获小数点,它也是一个点。如果我们的字符串有这些特殊字符(在我们的例子中是小数点),我们使用 \
来匹配这些字符。这就是我们使用 \.
的原因,它现在可以匹配我们的小数点。
(3)。 [0]+
,这将匹配我们字符串中的所有零。
(4)。 [0-9] * keep_places
,这只是一个字符串乘法。对于这个问题 keep_places
是 4
这意味着我们得到这种输出 [0-9][0-9][0-9][0-9]
。但是在 Regular expression operations 中,它 select 只有四位数字,每个数字都在 0 到 9 之间。还有一点,对于这个问题,你使用 [0-9]
或 [= 并不重要29=]。因为我们已经捕获了零,所以它开始从 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.
浮点数 = 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 方法是什么,或者我所拥有的是否足够体面。我觉得有点粗制滥造。
编辑:前导零的数量未知,我为示例选择了四个。所以我认为字符串格式不会起作用。
编辑:对于未知数量的 0,我认为没有比
更好的选择了import re
some_float = 11.00001203456789
how_many_to_keep = 4
regex = r"0[1-9]"
float_part = str(some_float).split(".")[1]
float_limiter = re.search(regex,float_part).start() if float_part.startswith("0") else -1
print(f'{some_float:2.{float_limiter+1+how_many_to_keep}f}')
是用表达式float_limiter+1+how_many_to_keep
实时计算0的个数,作为格式参数使用。这有点难看,但现在 returns 所有情况下的正确答案。输出是
11.00001235
我认为这是解决您的问题的最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 个部分。
[0-9]+
\.
[0]+
[0-9] * keep_places
(1)。 [0-9]
表示select只有0到9之间的一位数字。我们需要小数点前的多位数字。这就是我们添加 [0-9]+
的原因。如果小数点前没有任何整数,则添加 *
而不是 +
,它会检查零次或多次出现。如果您使用 +
意味着您必须有一个或多个值。
(2)。 .
这个点是 select 给定字符串中除了换行符以外的任何字符的特殊字符。我们需要捕获小数点,它也是一个点。如果我们的字符串有这些特殊字符(在我们的例子中是小数点),我们使用 \
来匹配这些字符。这就是我们使用 \.
的原因,它现在可以匹配我们的小数点。
(3)。 [0]+
,这将匹配我们字符串中的所有零。
(4)。 [0-9] * keep_places
,这只是一个字符串乘法。对于这个问题 keep_places
是 4
这意味着我们得到这种输出 [0-9][0-9][0-9][0-9]
。但是在 Regular expression operations 中,它 select 只有四位数字,每个数字都在 0 到 9 之间。还有一点,对于这个问题,你使用 [0-9]
或 [= 并不重要29=]。因为我们已经捕获了零,所以它开始从 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.