您的问题可能有多种解释。
如果只是为了角度以及在磁盘或设备上存储,我建议您使用完全不同的技术来存储您的值:存储为 32 位整数。
int encodedAngle = (int)(value * (0x7FFFFFFF / 180.0));
要恢复它,请执行相反的操作。
double angle = (encodedAngle / (0x7FFFFFFF / 180.0));
通过这种方式,您可以获得 180 度的完整 31 位分辨率和符号的 1 位分辨率。
您也可以使用这种方式将您的值保留在内存中,与直接使用双精度数相比,这种转换的成本更高,但如果您想保持内存较低但分辨率较高,那么这种方法可以很好地工作。 成本不是那么高,只是从整数到双精度数的转换和乘法,现代处理器将在很少的时间内完成它,并且由于访问的内存较少,如果列表包含很多值,您的代码将对处理器缓存更加友好。
你的分辨率将是
180 / ((2^31) - 1) = 8.38190318 × 10^-8
度,还不错。
单精度浮点的分辨率约为 360 / (2 ^ 23) 或 4 * 10 ^ -5。
更准确地说,严格劣于
360.
(可精确表示)的最大单精度浮点数约为 359.999969
。对于整个范围-360. .. 360
,您将能够表示至少与这两个数字之间的差异一样小的差异。
取决于,但不是。
32 位浮点数存储 7 位有效数字。对于存储正确的经度/纬度分辨率来说,这通常太小了。例如,openstreetmap.org 使用小数点后六位数字,因此最少八位,最多十位。
简而言之,使用float64。
通常浮点数是 4 个字节(32 位),而双精度数则是双倍。但是,如果您进行计算,确切的精度是特定于实现(和硬件)的。在某些系统上,所有浮点数都将存储为双精度数,这只会增加混乱。