类型 输入 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位吗?有效位数不等于精确位数?
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位吗?有效位数不等于精确位数?
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位向右的数字被舍入
即number类型存储在硬盘上是不是只有15位精确值,其他位则四舍五入。
我现在根本没法保存111122223333.1234这个数,插入数据库后再查询就成了111122223333.1230。而且通过JDBC查询,转换为java.math.BigDecimal类型后只有15位精确值,其他位都成了0。
我测试的时候是用的PL/SQL Developer的可视化编辑进行更新的,结果可能被PL/SQL截取了,如果直接以sql语句进行更新再用JDBC查询就不再有截取问题了,有多少个有效位就精确多少位。
现在可以肯定PL/SQL Developer可视化编辑工具对数字是按照双精度浮点型处理的。