关于浮点数的json解析
近期在工作中遇到个问题
通过post请求从其他系统(好像是C#写的)获得json字符串
{"geometry":{"rings":[[[40426489.331430912,3001752.0858958033],[40426225.692211367,3001750.0779145896],[40426202.957955509,3001594.0301330695],[40426290.959128119,3001559.0584689],[40426390.723533183,3001537.0470353812],[40426464.66273,3001645.3116807956],[40426489.331430912,3001752.0858958033]]],"spatialReference":{"wkid":2364}},"succeed":true,"msg":""}
然后在我的系统(java写的)中进行json解析,
開始用的json lib 2.4进行解析
得到的json对象,然后在通过这个json对象去计算面积,怎么都不正确。后来分析了一下解析后的代码
{"rings":[[[4.0426488E7,3001752],[4.0426224E7,3001750],[4.0426204E7,3001594],[4.0426292E7,3001559],[4.0426392E7,3001537],[4.0426464E7,3001645.2],[4.0426488E7,3001752]]],"spatialReference":{"wkid":2364}}
发现原来的 40426489.331430912,3001752.0858958033
变成了 4.0426488E7,3001752
这个差太远,小数部分所有丢失了
后面我的解决的方法是:不要这个json解析过程,直接对json字符串进行split,然后得到我想要的部分,然后再请求服务计算面积。
这个问题尽管攻克了,但我一直没弄明确json lib解析为什么会这样,我原以为是c#和java对浮点数的处理不同引起的。
我又试了网上几个经常使用的json解析包
Gson,smartJSON
解析出来的结果都是
{"rings":[[[4.042648933143091E7,3001752.0858958033],[4.042622569221137E7,3001750.0779145896],[4.042620295795551E7,3001594.0301330695],[4.042629095912812E7,3001559.0584689],[4.042639072353318E7,3001537.047035381],[4.042646466273E7,3001645.3116807956],[4.042648933143091E7,3001752.0858958033]]],"spatialReference":{"wkid":2364}}
尽管用的也是科学计数法,可是精度没损失
看来是json lib的问题了。