数字溢出的那点事儿
最后更新于:2022-04-01 19:49:43
近期的工作中,使用报表的频度越来越高,虽然展示数据更加方便了,但是报表加载数据时的各种问题也就迎之而来,最典型的问题:数字溢出;
先来看一下运行的错误日志: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e132da71317.jpg)
❦故事背景:
这个问题发生在统计分析中,当把报表和存储过程,程序之间的调用关系配置好之后,执行程序,就会出现上述图中的问题;
❦发展过程:
分析程序的运行日志,会发现程序调用存储过程的时候已经执行成功了,而当报表加载数据集时提示“加载数据集失败”,也就是说我们可以将问题的矛头指向报表的配置了:比如参数配置,比如填报属性的配置,比如各个字段的设置;
数字溢出问题:发生在统计分析中,所谓的数字溢出主要是指当前字段的大小无法满足查询到的数值(主要是位数,也就是精度上的大小区别);
所以主要有以下的解决方向:
1.view.xml在界面中,我们的field会设置类型,对于两位小数,且金钱的使用18,3;所以简单的float便不能满足我们的需求,因此我们需要在下图的位置对位数进行配置:![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e132da8996a.jpg)
在view.xml中我们需要将货币型(且保留两位小数)的字段设置为对应的类型,之所以会出现数字溢出的问题是因为,之前设置的datatype为float;而真正需要的是double,所以这里来温习一下float和double的知识:
单精度浮点数(float)与双精度浮点数(double)的区别如下:
(1)在内存中占有的字节数不同
单精度浮点数在机内占4个字节
双精度浮点数在机内占8个字节
(2)有效数字位数不同
单精度浮点数有效数字8位
双精度浮点数有效数字16位
(3)所能表示数的范围不同
单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
(4)在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快
2.页面中已经可以承载数据,但是统计分析的报表中无法承载查询到的数据,所以我们需要将润乾的显示格式设置到可以显示18,3和18,8的范围:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e132da9f15d.jpg)
**问题反思**
1.看来数字溢出这种出错,有数字对应的类型溢出的意思,不过出错信息还是少了点,而且抛的异常也没有达成对应的出错类,所以我们以后在架构的过程中可以尝试着对该方面的类进行进一步的封装,既可以打印日志又可以日志的指引作用更强;
2.数据库使用的是oracle,id定义的类型为number,没有定义精度,位数。一般定义Number的方法:Number(p,s),其中p,s都是可选的:
a、p代表精度,默认为38
b、s代表小数位数,取值范围-84~127,默认取值要看是否指定了p,如果制定了p,默认s为0,如果没有指定p,默认取最大值。
而目前的数据库中默认,那么就是Number(38,0),所以随着数据表中数据的增长,这会是个潜在的安全隐患。
3.再复习下数据库字段定义的相关知识:
1> NUMBER(p,s):固定精度数字类型
2> NUMBER:不固定精度数字类型,当不确定数字的精度时使用,PK通常使用此类型
3> DATE:当仅需要精确到秒时,选择DATE而不是TIMESTAMP类型
VARCHAR2:变长字符串,最长4000个字节
4> CLOB:当超过4000字节时使用,但是要求这个字段必须单独创建到一张表中,然后有PK与主表关联。此类型应该尽量控制使用;
虽然数字溢出的问题在我们处理数据的时候很常见,但是在解决问题时不能只局限于数字溢出,要补充和加深在其他方面的认识,这样慢慢的知识网才能越补越结实;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e132daaf087.jpg)
';