类型         输入                        plsql查看                          jdbc查看    
number(16,4) 111122223333.1234(16位)     111122223333.1230(15为精确)      111122223333.123(15为精确)
number(30,6) 1111222233334444(16位)    1111222233334440.000000(15位精确)  1111222233334440(15位精确)
number(30,6) 11112222333344444444(20位)1.11122223333443994E19(15位精确)  11112222333344400000(15位精确)难道说,number(m,n)类型不管m是多少都只能最多精确15位吗?有效位数不等于精确位数?

解决方案 »

  1.   


    Number的数据声明如下:
    表示                  作用                     说明
    Number(p, s)        声明一个定点数        p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127
    Number(p)        声明一个整数             相当于Number(p, 0)
    Number        声明一个浮点数          其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。定点数的精度(p)和刻度(s)遵循以下规则:
            当一个数的整数部分的长度 > p-s 时,Oracle就会报错
            当一个数的小数部分的长度 > s 时,Oracle就会舍入。
            当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
            当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入 
      

  2.   

    上面的规则是执行数据库操作时的逻辑精度,我现在关心的是数据存储在硬盘上的物理精度。
    即number类型存储在硬盘上是不是只有15位精确值,其他位则四舍五入。
    我现在根本没法保存111122223333.1234这个数,插入数据库后再查询就成了111122223333.1230。而且通过JDBC查询,转换为java.math.BigDecimal类型后只有15位精确值,其他位都成了0。
      

  3.   

    谢谢楼上了,找到问题哪里了,是PL/SQL Developer的问题。
    我测试的时候是用的PL/SQL Developer的可视化编辑进行更新的,结果可能被PL/SQL截取了,如果直接以sql语句进行更新再用JDBC查询就不再有截取问题了,有多少个有效位就精确多少位。
    现在可以肯定PL/SQL Developer可视化编辑工具对数字是按照双精度浮点型处理的。
      

  4.   

    我测试了3个都是可以完全输出正确的,工具sql dev