Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找小数点的简单方法_Python_String_Decimal - Fatal编程技术网

Python 查找小数点的简单方法

Python 查找小数点的简单方法,python,string,decimal,Python,String,Decimal,是否有一种简单的方法或集成函数来计算浮点数的小数位数 数字是从字符串中解析出来的,因此一种方法是在“.”符号后计算数字,但在我看来这很笨拙。是否有可能从float或Decimal对象中获取所需信息 解决方案(当然是其中之一:) 我选择使用python decimal.decimal类来帮助我解决问题: e = abs(Decimal(string_value).as_tuple().exponent) 注意:只有当构造十进制数的参数是字符串而不是浮点(这将导致浮点不准确)时,此选项才有效 非常

是否有一种简单的方法或集成函数来计算浮点数的小数位数

数字是从字符串中解析出来的,因此一种方法是在“.”符号后计算数字,但在我看来这很笨拙。是否有可能从
float
Decimal
对象中获取所需信息

解决方案(当然是其中之一:)

我选择使用python decimal.decimal类来帮助我解决问题:

e = abs(Decimal(string_value).as_tuple().exponent)
注意:只有当构造十进制数的参数是字符串而不是浮点(这将导致浮点不准确)时,此选项才有效

非常感谢所有其他的贡献。

一种简单的方法(易受@jgluie提到的本地化使用的影响)是

其中foo是类似于“23.512999238”的字符串

编辑 正如@Thomas Jung和@Mark Ransom提到的,这对于一些角落案件来说是相当幼稚的,需要作为

import re
from locale import localeconv
dec_pt = localeconv()['decimal_point']
decrgx = re.compile("\d+(%s\d+)?e(-|\+)(\d+)" % dec_pt)
if decrgx.search(foo):
    # still figuring this out
    raise NotImplementedError, "e notation not implemented"
else:
    digits = len(foo.split(dec_pt)[-1])

如果您知道您不会遇到解析问题(或者如果您让python本身或其他库为您处理解析问题,希望能够处理本地化问题)。。。只需解析它并使用它。返回值是一对值,其中一个是整数部分,另一个是小数部分。

“小数位数”不是浮点数的属性,因为它们是在内部存储和处理的

您可以从浮点数中获得任意多的小数位数。问题是你想要多大的准确度。将浮点数转换为字符串时,部分过程取决于精度

例如:

1.1 - int(1.1)
你会发现答案是:

0.10000000000000009
因此,对于这种情况,小数的数目是17。这可能不是你要找的号码

但是,您可以使用“舍入”将数字舍入到某个小数位数:

在这种情况下,小数位数被减少到3

你不能得到“浮点数的小数位数”,但你可以决定精度和你想要的小数位数


将浮点数转换为字符串是做出这种决定的一种方法。

由于Python浮点数在内部表示为二进制而不是十进制,因此除了转换为十进制之外,没有其他捷径。唯一的内置方法是转换为字符串。您可以编写自己的代码来进行十进制转换并计算数字,但这将是一项重复工作。

要重复别人说过的话(因为我已经键入了!),我甚至不确定这样的值在浮点数的情况下是否有意义,因为十进制和二进制表示法之间的差异;通常,由有限个十进制数字表示的数字在二进制中只有无限个数字表示

对于
decimal.decimal
对象,可以使用
as\u tuple
方法检索指数,该方法返回一个带有
符号
数字
指数
属性的命名元组:

>>> d = decimal.Decimal('56.4325')
>>> d.as_tuple().exponent
-4
>>> d = decimal.Decimal('56.43256436')
>>> d.as_tuple().exponent
-8

指数的负数是小数点后的位数,除非指数大于
0

十进制库用于处理十进制数,如在会计中。它本身没有返回小数位数的函数。当您意识到它所运行的上下文将其设置为用户想要的任何位置时,这尤其是一个问题

如果你得到一个字符串,你可以转换成十进制,但这将要么加上零以达到你的精度,要么使用舍入设置来截断它


您最好的赌注可能是在字符串中的点上进行拆分,并计算结果子字符串中的字符数。

我需要类似的东西,我测试了其中一些,我发现最快的是:

str(number)[::-1].find('.')
由于浮点问题,所有的模1给了我错误的结果,即使是十进制(数字)(注意,我需要在脚本中使用它来修复整个db的价格)

当我们有浮点数或类似的东西时,需要将字符串转换成十进制是非常不容易的

这是我的“长凳”:

我找到的计算小数点后的数字并将数字四舍五入的最快方法是

计算数字:

a=decimal.Decimal('56.9554362669143476');
lenstr = len(str(a).split(".")[1])
计算、检查和舍入:

a=decimal.Decimal('56.9554362669143476');
a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)
比较:

$ python2 -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); round(float(a),5) if a.as_tuple().exponent < -5 else float(a)'
10000 loops, best of 3: 32.4 usec per loop
$ python -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)'
100000 loops, best of 3: 16.7 usec per loop
$python2-mtimeit'导入小数;a=十进制。十进制('56.9554362669143476');如果a.as_tuple().指数<-5,则舍入(浮点(a),5)
10000个循环,最好3个:每个循环32.4 usec
$python-mtimeit'导入小数;a=十进制。十进制('56.9554362669143476');a=四舍五入(浮动(a),如果len(str(a).分割(“.”[1])>5,否则浮动(a)'
100000个循环,最好3个:每个循环16.7 usec

如果您只需要找到最有效数字的小数点,即最左边的数字,另一个基本解决方案是:

fraction = 0.001
decimal_places = int(f'{fraction:e}'.split('e')[-1])
这利用了科学符号(m x 10^n),它已经以10的幂(n)的形式提供了小数位数,系数(m)提高到-3,即从上述示例的1.000000e-03中导出的-3

<> >一个与十进制(STR(分数))的重要区别。ASTUTUP()。指数< /代码>是,科学记数法总是只考虑指数n的最高有效位,类似于<代码>十进制()。
当然,将字符串格式化为科学记数法也只能处理浮点数而不能处理字符串,因此任何浮点算术问题都会存在。但是,对于许多用例来说,上面的内容可能就足够了。

在python中不太确定,但在这里要非常小心本地化,因为在解释数字时,某些文化赋予“、”和“.”字符不同的含义是的,你是对的,但在我的例子中,我可以确保得到值
a=decimal.Decimal('56.9554362669143476');
a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)
$ python2 -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); round(float(a),5) if a.as_tuple().exponent < -5 else float(a)'
10000 loops, best of 3: 32.4 usec per loop
$ python -mtimeit 'import decimal; a=decimal.Decimal('56.9554362669143476'); a = round(float(a),5) if len(str(a).split(".")[1]) > 5 else float(a)'
100000 loops, best of 3: 16.7 usec per loop
fraction = 0.001
decimal_places = int(f'{fraction:e}'.split('e')[-1])