数据库保存经纬度时用什么数据类型

数据库保存经纬度时用什么数据类型一个事实各大在线地图,使用的经纬度坐标都精确到小数点之后第六位计算赤道周长为40075020m,维度360度,所以1度表示4007502m除以360等于111319.5m

一个事实

各大在线地图,使用的经纬度坐标都精确到小数点之后第六位

计算

赤道周长为40075020m,维度360度,所以1度表示4007502m除以360等于111319.5m。也就是说1个维度表示111319.5m。当小数点六位表示时可以精确到111319.5m*0.000001=0.1m。即各大地图提供的经纬度精度都是10cm,实际用的这个精度就够了,甚至进度为一米也可以的,保存经纬度数据无非是定位位置范围,精度一米一般都不会影响体验。所以说保存经纬度信息只需要保证小数点第六位甚至第五位没有误差就可以了。

浮点数的表示

目前几乎所有计算机都通过IEEE 754 标准保存浮点数。IEEE标准从逻辑上用三元组{S,E,M}表示一个数N,如下所示:在这里插入图片描述
N的实际值n由下列式子表示:
在这里插入图片描述
其中:

  1. n,s,e,m分别为N,S,E,M对应的实际数值,而N,S,E,M仅仅是一串二进制位。
  2. S(sign)表示N的符号位。对应值s满足:n>0时,s=0; n<0时,s=1。
  3. E(exponent)表示N的指数位,位于S和M之间的若干位。对应值e值也可正可负。
  4. M(mantissa)表示N的尾数位,恰好,它位于N末尾。M也叫有效数字位(sinificand)、系数位(coefficient)

而:
32位的单精度:N共32位,其中S占1位,E占8位,M占23位
64位的双精度:N共64位,其中S占1位,E占11位,M占52位。

先看这里了解浮点数的误差怎么来小数的二进制和十进制的转换》)
比如保存一个256.046132转成二进制后的数据为:
100000000.0000101111001111010011101000……
指数形式1.000000000000101111001111010011101000……*2^8(等会保存的时候前面那个1不必要保存)
这是一个无穷数,对于float类型,只能截取前32位进行存储,对于double只能截取前64位进行存储。所以
256.046132保存为float类型是存储形式为:00001000000000000000010111100111
读取出来后变成256.0461105有误差,如果亲自计算会发现第五位开始会有误差,因为只保存了小数点后的15位数,前三位没有误差因为
1/2^17=0.00000762939453125
1/2^16=0.0000152587890625
1/2^15=0.000030517578125
1/2^14=0.00006103515625
1/2^13=0.0001220703125
1/2^12=0.000244140625
1/2^11=0.00048828125
1/2^10=0.0009765625
1/2^9=0.001953125
根据无穷级数相加的规律,比如二进制小数点14位之后的改变在转换十进制时只能对十进制的小数点第4位开始影响,前三位影响不到,因为1/2^14=0.00006103515625所以后面的改变再大也不会相加>0.00099999…以至于进位影响前三位(除非后面全是1即无限循环的小数点0.99999999999……的二进制,但是从定位系统得到的经纬度信息是有限小数点的,所以就不用担心会大于)。所以可以得出结论当二进制整数位8位时即十进制256~511时用单精度浮点型能确保前三位小数是准确的
如果整数部分小于256当然会更加精确所以用单精度浮点型float保存经纬度只能确保小数点前三位准确即精度为100m 那太不好了。
同理的用双精浮点型double保存经纬度,能保存二进制小数点点后44位数之多
1/2^25=0.0000000298023223876953125‬
保存到25位已经可以保证前六位精度了,即用64位的双精浮点型double保存经纬度信息不会有误差

结论

用64位的双精浮点型double保存经纬度信息不会有误差,实在放心不下可以用decimal,官方推荐绝对没有误差

今天的文章数据库保存经纬度时用什么数据类型分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/67668.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注