点X不NG 2018-06-25 06:07 采纳率: 51.5%
浏览 3035
已采纳

LONG类型长值存储oracle数据库number字段中取值发现不正确

1.页面用户输入银行卡位数比较长,所以服务端用long类型装载。
当存入到oracle数据库中时,查看数据变成了科学记数法标记。(网上说没有指定oracle的number字段长度会就会科学计数超过8位还是9位)。然后问题来了.......
当取出库中字段去前端展示时候,发现最后四位都变成了0,有的是最后追加了10000。

例子:
原始值 123457689098221781
存到库中是科学记数法
再次取值 就成了 123457689098220000 或者 1234576890982210000
(奇怪的是导出excel时候,文件中的卡号都是正确的.....)

才疏学浅....请帮忙看看

  • 写回答

6条回答 默认 最新

  • 菜o籽 2018-06-25 07:22
    关注

    每一个存放数据的地方,不管是数据库中表列,还是应用程序中界面UI,它在展示数据的时候都有长度属性的。就像你这个 long型的数字,有十几位长,在丢失精度的情况下,oracle肯定会用科学计数法的形式 保存。就像在 excel中新建标签页中 你输入18位身份证号,回车默认显示成6.xxxxxxxxxxx*10E2这种形式了。但是字符型的话就不会出现这种情况。就像1楼说的。原始存储类型定义成字符型的,需要在其他地方做数值运算是可以强制转换成数值型

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • Fatal Error 2018-06-25 06:26
    关注

    银行卡号用VARCHAR类型存储,不要用数值类型。

    评论
  • 书香门第 2018-06-25 07:46
    关注

    你看一下你的oracle表这一列的数据类型是什么?如果是数字类型的,应该是类似于decimal() 或者 numeric()之类的,如果是这两个类型,会有精度和小数位刻度设置,确保该精度设置能够存储你的数据。

    评论
  • weixin_40993811 2018-06-25 08:59
    关注

    银行卡号用数值型是不合适的,建议你用VARCHAR。

    评论
  • 点X不NG 2018-06-25 09:24
    关注

    问题找到了但是暂时不知道解决方法,用long和String或者BigDecimal接受都是正确的卡号,只不过用注解@responsebody 返回给前端时候超出16为的数据都会变为0.

    评论
  • wanglw326 2018-06-26 10:12
    关注

    建议去看下关于浮点数据的精度问题,并不是所有的浮点数都可以还原,记得之前看python时候看到过,浮点数有最大精度,也就是小数点后的最大长度,当数据超过这个长度之后就忽略掉了

    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 win10商店接入问题
  • ¥15 java 这种树形框吗
  • ¥40 找同学帮敲Python代码
  • ¥15 MYSQL 订单的商品明细重复计算问题
  • ¥15 微信实时共享位置修改
  • ¥100 TG的session协议号转成直登号号后客户端登录几分钟后自动退出设备
  • ¥50 共模反馈回路的小信号增益
  • ¥15 arduino ssd1306函数与tone函数放歌代码不兼容问题
  • ¥70 0.96版本hbase的row_key里含有双引号,无法deleteall
  • ¥15 诊断性META分析合并效能的检验