【问题分析】
Ⅰ、在前端界面查询,发现了库存中存在这样的数量值。但是在数据库中查询时显示正常。即6.999999999999997 为 7。
Ⅱ、至于这种小数产生,我以为是oracle存储过程计算的时候也会失真?后来发现我这是由于其他问题造成的。
🌂对于前端和数据库的查询结果不一致,我也很纳闷。于是,我把数据里面的7,进行重写,这样前端就显示正常了。于是我推断,前端界面显示的数据库值是准确的,而我们查询的结果进行了一些处理,导致6.999999999999997查看到的结果是7。
Ⅳ、数据库会默认6.999999999999997为Number,查询的结果如下:
🌫如果我们将Number类型的数据进行一个to_char的处理,如下:(可以发现,数据完整显示)
⑥前端显示 2E-12 ,那么它实际的值是多少呢?可以通过 to_char() 来显示它原来的值。最后发现0.000000000002这样的值,number类型显示如下:
【知识补充】
①百度知识
Oracle Number类型是以十进制形式存储整数和浮点数,语法为 Number( p , s ) 。
其中 p 为精度,即所有有效数字位数; s 为刻度范围,即小数位数。 p 的取值范围是
1~38
,s的取值范围范围从
-84
到
127
在此我也查询了一些资料,精度和刻度的限制是在插入时,根据精度和刻度对插入的值进行一个四舍五入的处理以及限制。并没有提到和 select 查询的关系。
PS:看完这写也并不知道说的是···,感觉自己没用到这东西。但是大概的意思是:
我们是设计数据库的时候,常用的类型用 VARCHAR2 类型,一般我们会指定 字符的长度,好像是必须指定的。但是 Number 类型我们一般不设置他的精度和刻度范围。
那么这个精度和刻度就是像 VARCHAR2 写法相同。如下:
p设置为0,s设置大于0,会提示类型不正确
NUMBER(0,5)
p设置为大于0,s设置0,显示为 Number(p)
NUMBER
(
5
,
-
2
) 表示有效位为5位,小数点左边两位进行四舍五入。即 插入11268 存11300
NUMBER
(
5
,
2
) 表示有效位5位,小数位后最多两位进行四舍五入。即插入 123.356 存 123.36
如果四舍五入后的位数超过最大有效位置,将会出错。即 NUMBER(5,-1) 插入 99999 四舍五入之后 100000 超过有效位数出错。
保留到小数点后几位不看有效位数。
NUMBER(*,1)
②我们一般会直接使用Number类型,那么默认的 精度和刻度 又是多少呢?
创建一张表作为测试
create Table num_dome (
NUM_VAL NUMBER
将数据类型设置为NUMBER类型,我们插入一个除不尽的小数,以此来判断它的最大刻度。
insert into num_dome values (2/3)
PS: 最大精度38,这里小数位后有39位什么意思?
select 查询查看显示结果(小数点后15位)
插入的值是有小数的,并且不为0 ,说明刻度 s 大于0 ,若 s>0 那么最大有效位为 p,即39??p的取值范围为 1~38 ?
若 p就为39,那么 s 的值好像是变化的 s=39-p。他们是否存在这样的一个动态关系?是否 s 一定要是一个明确的数字?
select查询和数据库存储相同,只不过把位数缩短了,取15位进行显示。
这些问题其实并没有太大的影响,但一直想弄明白。包括也查了一些资料,并没有得到确切的答案。
本文是自己对Number类型精度刻度的思考,如有错误,请务必告知。(这篇一直零散的写了几天,一直在想通过什么样的方式去测试,以及能够得出什么样的结论)