关于JSONObject处理json字符串浮点数误差问题

「已注销」 2018-07-25 06:34:41
new JSONObject();
JSONObject json=JSONObject.fromObject(recBuff);//直接把json字符串读给json对象

生产系统刚发现的问题,很急!上面这条语句经常把recBuff这个json格式的报文里的浮点金额出现1分钱误差,如何让它把金额当成字符串而不是浮点处理?
...全文
1314 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2018-07-26
  • 打赏
  • 举报
回复
引用 12 楼 qq_41696869 的回复:
谢谢楼上。我想到一个方法,感觉可行,就是用replace的方法,把浮点数替换成加上引号的字符串,后续json转xml的时候,会自动去掉所有字段的双引号,和之前不加双引号效果一样。


你的json格式不是固定的?如果格式固定,写一个bean来转换是最好的方式
夜雨恋星辰 2018-07-26
  • 打赏
  • 举报
回复
引用 13 楼 qq_41696869 的回复:
有谁能提供一下把冒号后面的浮点数替换成带双引号字符串的方法吗(好像要用正则)?java和正则不太熟,之前做的程序也是临时边百度边查资料做的。

正则: .*:\s*(\d+\.?\d*)
{
"a": 1,
"b": 2.0
}
会获取到1和2.0,获取到就可以自己操作啦
「已注销」 2018-07-26
  • 打赏
  • 举报
回复
谢谢楼上。我想到一个方法,感觉可行,就是用replace的方法,把浮点数替换成加上引号的字符串,后续json转xml的时候,会自动去掉所有字段的双引号,和之前不加双引号效果一样。
「已注销」 2018-07-26
  • 打赏
  • 举报
回复
有谁能提供一下把冒号后面的浮点数替换成带双引号字符串的方法吗(好像要用正则)?java和正则不太熟,之前做的程序也是临时边百度边查资料做的。
「已注销」 2018-07-26
  • 打赏
  • 举报
回复

这样就搞定了,匹配后还要基于原来匹配的值进行修改。
tianfang 2018-07-26
  • 打赏
  • 举报
回复
首先,差一分钱是浮点数的固有误差,单精度浮点数只用6位多的精度,到百万级的时候,就会出现数值不能用浮点数表示,浮点数就近似到相邻的一个值。

必须用 JSONObject.toBean 方法处理:

https://github.com/jenkinsci/json-lib/blob/16052d1f74908fb59430eddd73f42aec2469b313/src/test/java/net/sf/json/TestJSONObject.java
1206 行开始的几个testToBean_NumberBean方法

https://github.com/jenkinsci/json-lib/blob/16052d1f74908fb59430eddd73f42aec2469b313/src/test/java/net/sf/json/sample/NumberBean.java

「已注销」 2018-07-25
  • 打赏
  • 举报
回复
业务流程是对方把json报文发来,我接收后转成xml发给核心系统,核心系统处理后返回xml报文,我转成json报文发给对方。对方对数据类型敏感,浮点数不能加双引号。
我现在觉得遍历json报文把浮点型的数加上双引号变成字符串似乎好一些,因为转成xml的时候会去掉双引号,返回来的xml是没双引号的,这样我可以转成json发回去。
不知道遍历json报文把浮点型的数加上双引号变成字符串代码有没有。
「已注销」 2018-07-25
  • 打赏
  • 举报
回复
有没有基于net.sf.json.JSON这个包的解决方案,生产代码不能改动太大,不然还要进行大量测试
zwbonline1112 2018-07-25
  • 打赏
  • 举报
回复
引用 7 楼 Galeno1994 的回复:
引用 6 楼 qq_41696869 的回复:
用的是json-lib-2.4-jdk15.jar,另外只是转发随机报文,不涉及解析,不好自定义对象
jar包对的呀,我用的就是这个版本,运行没问题呀
不对,这个jar不行,Gson可以
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
zwbonline1112 2018-07-25
  • 打赏
  • 举报
回复
引用 6 楼 qq_41696869 的回复:
用的是json-lib-2.4-jdk15.jar,另外只是转发随机报文,不涉及解析,不好自定义对象
jar包对的呀,我用的就是这个版本,运行没问题呀
「已注销」 2018-07-25
  • 打赏
  • 举报
回复
用的是json-lib-2.4-jdk15.jar,另外只是转发随机报文,不涉及解析,不好自定义对象
zwbonline1112 2018-07-25
  • 打赏
  • 举报
回复
也有可能是jar版本的问题,试试这个
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
zwbonline1112 2018-07-25
  • 打赏
  • 举报
回复
如果你还是想用这个jar包,那就不要用 JSONObject,自定义一个对象去接,然后把数值字段设置为String
「已注销」 2018-07-25
  • 打赏
  • 举报
回复

把问题还原了,用原来的库该如何写代码呢?
zwbonline1112 2018-07-25
  • 打赏
  • 举报
回复
JsonObject jObject = new Gson().fromJson(recBuff, JsonObject.class);
zwbonline1112 2018-07-25
  • 打赏
  • 举报
回复
用Gson试试

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧