我试图转换字符串' 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'。
非常感谢有关此主题的任何帮助。
由于
答案 0 :(得分:1)
'6.1e-7'
是一个字符串:
>>> type('6.1e-7')
<class 'str'>
虽然6.1e-7
是浮点数:
>>> type(6.1e-7)
<class 'float'>
0.00000061
与6.1e-7
>>> 0.00000061 == 6.1e-7
True
而且,在内部,此浮动由0
和1
表示。这只是同一个浮动的另一个表示。
但是,当转换为字符串时,它们不再作为数字进行比较,它们只是字符:
>>> '0.00000061' == '6.1e-7'
False
你无法将字符串与数字进行比较:
>>> 0.00000061 == '6.1e-7'
False
答案 1 :(得分:0)
你的问题描述过于扭曲而无法准确理解,但我会尝试对此进行一些心灵感应。
在内部格式中,数字不保留任何格式信息,也不保留整数和浮点数。对于整数123,您无法恢复它是显示为"123"
," 123 "
(前后有大量空格),000000123
还是+0123
。对于浮动数字,可以使用0.1
,+0.0001e00003
,1.000000e-1
和无数其他形式。在内部,所有这些都将产生相同的数字。
(使用IEEE754“十进制浮动”时有一些细节,但我相信不是你的情况。)
保存到数据库时,内部表示停止了很多意义。相反,数据库细节开始起作用,它可能完全不同。例如,SQL建议使用类似numeric(10,4)
的列类型,并且每个值将转换为与列类型对应的十进制格式(通常,作为文本字符串保存在磁盘上,带或不带小数点)。在MongoDB中,您可以将浮动值保留为JSON编号(IEEE754 double
)或文本。每个变体都有自己的细节,但是,如果您选择文本,每次形成此文本时,您自己都有责任提供正确的格式。你想在点之后看到一个8位数的定点十进制数?好的,没有问题:你只需按照%.8f
格式化每次准备这样的表示。
表示选择的问题是:
如果您始终使用%.8f
格式化值,则会达到唯一性,但不会进行排序。 %.g
,%.e
和其他文本格式相同,除了为保持这种排序而构造的特殊(非人类可读)格式。如果您需要订购,只需使用数字作为数字,而不是专注于它们在文本表单中的样子。
(并且,你的问题与numpy并不相关。)