Python float()对科学记数法的限制

时间:2018-04-29 09:04:10

标签: python-3.x numpy floating-point

  • python 3.6.5
  • numpy 1.14.3
  • scipy 1.0.1
  • cerberus 1.2

我试图转换字符串' 6.1e-7'到浮点数0.00000061所以我可以将它保存在mongoDb字段中。

我的问题是浮动(' 6.1e-7')不起作用(它适用于浮动(' 6.1e-4'),但不是浮动(' 6.1e-5')等等。

Python float

我似乎无法在float limitations上找到有关其发生原因的任何信息,我发现的每个示例都显示了e-3的转换,从未达到过。

numpy的

我安装了Numpy来试试float96()/ float128()...... float96()不存在,而float128()返回一个浮动' 6.09999999999999983e-07'

格式

我尝试格式化(6.1E-07,' .8f')'这是有效的,因为它返回一个字符串' 0.00000061'但是当我将字符串转换为浮点数(因此它可以通过cerberus validation)时,它将恢复为' 6.1E-7'。

非常感谢有关此主题的任何帮助。

由于

2 个答案:

答案 0 :(得分:1)

'6.1e-7'是一个字符串:

>>> type('6.1e-7')
<class 'str'>

虽然6.1e-7是浮点数:

>>> type(6.1e-7)
<class 'float'>

0.000000616.1e-7

相同
>>> 0.00000061 == 6.1e-7
True

而且,在内部,此浮动由01表示。这只是同一个浮动的另一个表示。

但是,当转换为字符串时,它们不再作为数字进行比较,它们只是字符:

>>> '0.00000061' == '6.1e-7'
False

你无法将字符串与数字进行比较:

>>> 0.00000061 == '6.1e-7'
False

答案 1 :(得分:0)

你的问题描述过于扭曲而无法准确理解,但我会尝试对此进行一些心灵感应。

在内部格式中,数字不保留任何格式信息,也不保留整数和浮点数。对于整数123,您无法恢复它是显示为"123"" 123 "(前后有大量空格),000000123还是+0123。对于浮动数字,可以使用0.1+0.0001e000031.000000e-1和无数其他形式。在内部,所有这些都将产生相同的数字。

(使用IEEE754“十进制浮动”时有一些细节,但我相信不是你的情况。)

保存到数据库时,内部表示停止了很多意义。相反,数据库细节开始起作用,它可能完全不同。例如,SQL建议使用类似numeric(10,4)的列类型,并且每个值将转换为与列类型对应的十进制格式(通常,作为文本字符串保存在磁盘上,带或不带小数点)。在MongoDB中,您可以将浮动值保留为JSON编号(IEEE754 double)或文本。每个变体都有自己的细节,但是,如果您选择文本,每次形成此文本时,您自己都有责任提供正确的格式。你想在点之后看到一个8位数的定点十进制数?好的,没有问题:你只需按照%.8f格式化每次准备这样的表示。

表示选择的问题是:

  1. 唯一性:对于相同的值,不应使用不同的表单。否则,您可以在多个密钥下存储相同的内容,然后将旧的密钥误认为最后一个。
  2. 订购意识:DB应该能够为“天花板键值对”之类的请求提供自然的值顺序。
  3. 如果您始终使用%.8f格式化值,则会达到唯一性,但不会进行排序。 %.g%.e和其他文本格式相同,除了为保持这种排序而构造的特殊(非人类可读)格式。如果您需要订购,只需使用数字作为数字,而不是专注于它们在文本表单中的样子。

    (并且,你的问题与numpy并不相关。)