linux 和 windows 版本的 pycharm 中的数字格式不同

number format is different in linux and windows version of pycharm

我在Linux中的PyCharm中使用了一个python代码,数字的格式是 -91.35357。当我在 PyCharm 中使用 Windows 格式的相同代码时 -91.35356999999999。问题是值包含在我需要打开的文件名中(要打开的文件列表很长)。

任何人都知道可能的解释并且很想修复它?

您在 Linux 上的 PyCharm 只是对您的大浮点数进行四舍五入。将它四舍五入到最接近的 6 或 7 可以解决您的问题,但不要使用这些作为文件名。

在这两种情况下保持代码不变,它们可以有多种解释:

1) 32 位处理器处理浮点数的方式与 64 位处理器不同。

2) PyCharm 对于 Linux 和 Windows 对于我们无法准确确定的浮点数表现不同,可能是 PyCharm 对于 Windows 是更好的优化。

编辑 1

第 1 点的解释

在 32 位处理器上,一切实际上都是在内部以 80 位精度完成的。精度实际上只决定了这些位中有多少存储在内存中。这是不同的优化设置可以稍微改变结果的部分原因:它们将舍入量从 80 位更改为 32 位或 64 位。

编辑 2

您可以使用哈希映射将数据保存在文件中,然后将它们映射到坐标上。 示例:

# variable = {(long,lat):"<random_file_name>"}
cordinates_and_file ={(-92.45453534,-87.2123123):"AxdwaWAsdAwdz"}

浮点数

永远记住浮点数的精度是有限的。如果您考虑一下,如果您将存储限制为 32 位或 64 位(或任何其他数字),必须 限制您表示数字的精确程度。

在Python

Python 只提供一种浮点类型。浮点数通常使用 64 位实现,但它们在一个 Python 二进制文件中可能是 64 位,在另一个二进制文件中可能是 32 位,因此您不能真正依赖它(但是,请参阅下面的 @Mark Dickinson 评论)。

我们来测试一下。但请注意,因为 Python 不提供 float32 和 float64 替代方案,我们将使用不同的库 numpy 来为我们提供这些类型和操作:

>>> n = 1.23456789012345678901234567890 
>>> n
1.2345678901234567  
>>> numpy.float64(n)
1.2345678901234567
>>> numpy.float32(n)
1.2345679

这里我们可以看到 Python,在我的电脑中,将变量作为 float64 处理。这已经截断了我们引入的数字(因为 float64 只能处理这么多精度)。

当我们使用 float32 时,精度会进一步降低,并且由于截断,我们可以表示的最接近的数字会略有不同。

结论

浮动分辨率有限。此外,一些操作在不同的体系结构中表现不同。

即使您使用一致的浮点大小,也并非所有数字都可以表示,并且操作会累积截断错误。

将浮点数与另一个浮点数进行比较时应考虑到可能的误差幅度。不要使用 float_a == float_b,而是使用 abs(float_a - float_b) < error_margin.

依赖浮点表示总是一个坏主意。 Python 有时使用科学记数法:

>>> a = 0.0000000001
>>> str(a)
'1e-10'

您可以获得一致的舍入近似值(即在文件名中使用),但请记住存储和表示是不同的东西。这个其他线程可能会帮助你:Limiting floats to two decimal points

一般来说,我建议不要在文件名或任何其他类型的标识符中使用浮点数。

纬度/经度

float32 数字没有足够的精度来表示 latitude/longitude 对中的第 5 位和第 6 位小数(取决于整数部分是一位、两位还是三位)。

如果您想了解实际情况,请查看此页面并测试您的一些数字:https://www.h-schmidt.net/FloatConverter/IEEE754.html

代表

请注意,Python 在表示浮点值时对其进行舍入:

>>> lat = 123.456789
>>> "{0:.6f}".format(lat)
'123.456789'
>>> "{0:.5f}".format(lat)
'123.45679'

并且如上所述,latitude/longitude 不能由 float32 正确表示到小数点后第 6 位,此外,当 Python 表示时,截断的浮点值会四舍五入:

>>> lat = 123.456789
>>> lat
123.456789
>>> "{0:.5f}".format(numpy.float64(lat))
'123.45679'
>>> "{0:.5f}".format(numpy.float32(lat))
'123.45679'
>>> "{0:.6f}".format(numpy.float32(lat))
'123.456787'

如您所见,该 float32 数字的舍入版本与小数点后 5 位的原始数字不匹配。但也会对 float64 数字的小数点后 5 位进行四舍五入。