今天在做db2测试的时候发现一个问题:
select 1/3 from sysibm.sysdummy1;
结果得到: 0!!!!郁闷,怎么会这样。
后来仔细查了一下db2的资料,发现db2的算术运算是遵循一下规则:
argument1 argument2 result
decimal(a,b) decimal(c,d) decimal(p,s)
p=MAX( max(b,d) + max(a-b,c-d)
s=MAX(b,d)
但除法的小数位计算遵循下面规则: 31-p+s-s'(其中p为被除数的精度,s为被除数的小数位,s'为除数的小数位)
举例来讲:
1/3 由于,由于两者数据类型皆为int,所以结果也为int 即结果为0
1.0/3,由于1.0为小数,按照小数除法的规则,
describe select 1.0 from sysibm.sysdummy1; (2,1)
describe select 3 from sysibm.sysdummy1; (4,0)
31-2+1-0=31-1=3031-2+1=30,故此保留30位小数。
select 1.0/3 from sysibm.sysdummy1;
结果为:--- 0.333333333333333333333333333333
1/3.0,由于1为int,3.0为小数
describe select 1 from sysibm.sysdummy1; (4)---4个字节,共占10位,其中符号位一位,共11位
describe select 3.0 from sysibm.sysdummy1; (2,1)
31-11+0-1=31-12=19,故此保留19位小数。
select 1/3.0 from sysibm.sysdummy1;
结果为:---0.3333333333333333333
另外,如果你的db2没有设置过的话,运行一下语句可能会出错:
select DEC(1,31,0)/DEC(1,31,5) from sysibm.sysdummy1;
报错说除法运算无效。其实原因就是小数位的问题,按照31-p+s-s'的算法,31-31+0-5=-5,也即小数位数为-5,小数位又怎么能是负值呢?所以就报错了。
此时需要设置一个参数:MIN_DEC_DIV_3. 执行以下语句即可
DB2 UPDATE DB CFG FOR db_name USING MIN_DEC_DIV_3 YES
即将MIN_DEC_DIV_3的值设置为YES,意思是小数位数取3和按照31-p+s-s' 计算出的小数位两者的较大值。即是说最小也有3位小数,这样自然就不会再报错了。
需要注意的是,虽然可以使用db2 update db cfg 命令来设置MIN_DEC_DIV_3这个参数,但是实际上这个参数在db cfg 中是不可见的。
也就是说不要指望使用db2 get db cfg for db_name 可以找到它,这是一个隐藏的参数(搞不懂db2是什么用意。。。。。。)。
从db2v7版本以上又引入了一个DB2_MIN_DEC_DIV_6这么一个参数,可以将小数位至少保存6位,如果MIN_DEC_DIV_3和DB2_MIN_DEC_DIV_6同时为YES,则DB2_MIN_DEC_DIV_6覆盖MIN_DEC_DIV_3。
DB2_MIN_DEC_DIV_6这个参数可以使用db2set 来设置:语句为
db2set DB2_MIN_DEC_DIV_6=YES 可以使用DB2SET -ALL 来查看
设完需要重启db2。
(PS:我使用的是db2 V9.5,服务器为AIX,在我自己的平台上测试MIN_DEC_DIV_3是可以的,但是无论我把DB2_MIN_DEC_DIV_6设置为YES或者NO,都没看出有什么效果,不知道是我的设置方法不对还是怎么回事。)
如果想要最初的语句1/3得到非零值。可以使用如下方法:
(1) select 1.0/3 from sysibm.sysdummy1; ---得到小数值 结果: --0.333333333333333333333333333333
(2) select 1/3.0 from sysibm.sysdummy1; ----同样得到小数值 结果: --0.3333333333333333333
(3) select cast(1 as float)/3 from sysibm.sysdummy1; --使用cast将1转为float型,然后再才除以3. 结果:0.3333333333333333
(4) select dec(1,10,2)/3 from sysibm.sysdummy1; ---使用dec函数将1转换为decimal(10,2),然后除以3 结果:0.33333333333333333333333
其实如果想要把2个数的商四舍五入保存两位小数,
oracle中可以直接使用round函数即可:
select round(a/b,2) from dual;
而db2中却要绕几个弯才行:需要使用
select dec(cast(a as float)/b+0.005,10,2) from sysibm.sysdummy1; 先用cast转换a为float型,然后运算,再使用+0.005作为四舍五入,然后再使用dec截取2位小数。或者:
select cast(round(cast(a as float)/b,2) as decimal(10,2)) from sysibm.sysdummy1; 先使用cast转a为float,然后运算,再使用round四舍五入取2位小数,然后使用cast转换为decimal(10,2)型。
哎。。。可怜的db2啊。
下边贴一个关于db2小数位的英文文献供参考:
Problem
You are receiving a SQL0419N message or inappropriate $ values against decimal divisions, or a truncation of decimal values.
Cause
Negative or an inappropriate scale of decimal division.
Solution
First, here are the details of SQL0419N,
-------------------------------------------------------------------------------------------------
SQL0419N A decimal divide operation is not valid because the result would have a negative scale.
Explanation: A specified decimal division is not valid because it will result in a negative scale.
The formula used internally to calculate the scale of the result for decimal division is:
Scale of result = 31 - np + ns - ds
where np is the precision of the numerator, ns is the scale of the numerator, and ds is the scale of the denominator.
Federated system users: Decimal division can occur at the federated server, at data sources, or both. The specified decimal division results in an invalid scale for that data source.
The statement cannot be processed.
-------------------------------------------------------------------------------------
Therefore, if (np + ds) > (31 + ns) then SQL0419N will be returned.
To avoid this situation a database configuration parameter MIN_DEC_DIV_3 could be set. The default value is NO and it could be set to YES.
When MIN_DEC_DIV_3 is set to YES a decimal division will have a scale of MAX(3, 31-np+ns-ds). This will guarantee a minimum scale of 3, which will avoid triggering the SQL0419N message
The MIN_DEC_DIV_3 could be set as:
db2 update db cfg for <dbname> using MIN_DEC_DIV_3 YES
db2 terminate
db2 deactivate db <dbname>
db2 activate db <dbname>
MIN_DEC_DIV_3 is a hidden database parameter; that is, "db2 get db cfg for <db-name>" will not show this parameter. The only way it could be checked is by performing a decimal division. For example, to check whether it's set to YES or NO, do the following,
db2 connect to <dbname>
db2 "create table test (col1 int)"
db2 "insert into test values (0)"
db2 "insert into test values (1)"
db2 select "DEC(1,31,0)/DEC(1,31,5) from test"
If MIN_DEC_DIV_3 is set to YES the output will be,
1
---------------------------------
1.000
1.000
2 record(s) .
If the MIN_DEC_DIV_3 is set to NO the output will be,
SQL0419N A decimal divide operation is not valid because the result would have a negative scale. SQLSTATE=42911
(Explanation : np = 31, ds = 5, ns = 0. Hence, np + ds > 31 + ns )
From the beginning of DB2 v7 a new functionality to obtain a minimum scale of 6 for division is introduced (APAR#IY15192).
The MIN_DEC_DIV_3 database configuration parameter ensures a minimum scale of 3, which is little short for some customer's calculations. So, this is enhanced and a registry variable DB2_MIN_DEC_DIV_6 is introduced. This might have two values, YES or NO.
DB2_MIN_DEC_DIV_6 overrides MIN_DEC_DIV_3 to allow a minimum scale of 6 instead of 3. With this extra scale a correct dollar amount is ensured.
DB2_MIN_DEC_DIV_6 could be set as follow,
db2set DB2_MIN_DEC_DIV_6=YES
db2 terminate
db2stop
db2start
To set DB2_MIN_DEC_DIV_6 to YES, a prior setting of MIN_DEC_DIV_3 is a requirement.
After setting of DB2_MIN_DEC_DIV_6 to YES, if the select query mentioned earlier in this document is run, the following will return,
db2 connect to <dbname>
db2 select "DEC(1,31,0)/DEC(1,31,5) from test"
1
---------------------------------
1.000000
1.000000
2 record(s) .
Changing this database configuration parameter and/or the registry variable may cause changes to applications for existing databases. This can occur when the resulting scale for decimal division would be impacted by changing this database configuration parameter and/or registry variable. Listed below are some possible scenarios that may impact applications. These scenarios should be considered before changing the MIN_DEC_DIV_3 and/or DB2_MIN_DEC_DIV_6 on a database server with existing databases.
- If the resulting scale of one of the view columns is changed, a view that is defined in an environment with one setting could fail with SQLCODE -344 when referenced after the database configuration parameter is changed. The message SQL0344N refers to recursive common table expressions, however, if the object name (first token) is a view, then you will need to drop the view and create it again to avoid this error.
- A static package will not change behavior until the package is rebound, either implicitly or explicitly. For example, after changing the value from NO to YES, the additional scale digits may not be included in the results until rebind occurs. For any changed static packages, an explicit rebind command can be used to force a rebind.
- A check constraint involving decimal division may restrict some values that were previously accepted. Such rows now violate the constraint but will not be detected until the one of the columns involved in the check constraint row is updated or the SET INTEGRITY command with the IMMEDIATE CHECKED option is processed. To force checking of such a constraint, perform an ALTER TABLE command in order to drop the check constraint and then perform an ALTER TABLE command to add the constraint again.
相关推荐
13. **MOD(exp)**: 返回`exp`的模数,即除法的余数。 14. **POWER(exp1, exp2)**: 返回`exp1`的`exp2`次幂。 15. **RAND(exp)**: 根据`exp`生成一个介于0到1之间的随机数。 16. **ROUND(exp1, exp2)**: 对`exp...
小数位是指数字的小数部分的位数,它不可以是负数,也不能大于精度。最大精度是 31 位。小数型的范围从 -1031+1 到 1031-1。 * 单精度浮点数(REAL):单精度浮点数是实数的 32 位近似值。数字可以为零,或者在从 -3...
8. P(压缩号):允许的长度为1到16个字节,系统会指定默认值8个字节(也就是15位数字)和0个小数位。 ABAP命名规则: 1. 使用至少1个但不超过8个字符。 2. 不要使用以下字符:句点(.); 逗号(,); 空格( ); 括号‘...
3. 关系数据库中的专门运算包括选择、投影、连接和除法。 4. 在关系A×B中,属性数量等于A和B属性数量之和,元组数量等于A的元组数乘以B的元组数。 5. 函数依赖分为平凡函数依赖和非平凡函数依赖,前者是指X的任何真...
内容概要:本文详细阐述了C++类的构造与析构机制,解释了这两种特殊成员函数的工作原理和应用场景,涵盖构造函数的特点、分类与调用方式、构造函数初始化列表、以及析构函数的作用、调用时机和注意事项。文中还探讨了在C++编程中如何运用这些机制实现高效的资源管理和内存安全,特别是遵循RAII原则、避免常见错误(如资源未释放、重复析构、异常安全问题)、并在多线程环境中合理处理同步操作。 适合人群:具有基础C++编程技能的程序员,尤其是希望深入了解对象生命周期管理和高级资源管理技术的人群。 使用场景及目标:①理解和应用C++类的构造与析构机制来编写高效的代码;②预防和修复由于资源管理不当引发的各种错误和性能问题;③提高对面向对象编程的理解,掌握在多线程环境下的资源管理技巧。 其他说明:通过实际案例深入分析C++中构造函数和析构函数的应用,强调RAII(Resource Acquisition Is Initialization)原则的重要性。同时也提及了未来学习方向如智能指针和移动语义等内容,帮助开发者更好地掌握C++编程技巧。
本文为抛砖引玉:简单描述,如需根据自身业务详细设计,请随时联系
百合检验表格(食品香辛料质量验收记录表)检验表格(食品香辛料质量验收记录表).docx
最新PHP盲盒商城系统源码ThinkPHP框架
奇异值分解(Singular Value Decomposition,简称SVD)是线性代数中的一种重要矩阵分解方法,广泛应用于数据处理和信号分析。在本场景中,我们关注的是如何利用SVD来确定VMD(Variable Modulation Decomposition,可变调制分解)的K值。VMD是一种信号分解技术,它能够将复杂信号分解为一系列调制频率成分,对于非平稳信号的分析和处理非常有用。 理解SVD的基本概念:任何m×n的实数或复数矩阵A都可以表示为三个矩阵的乘积,即A=UΣV^T,其中U是m×m的正交矩阵,Σ是一个m×n的对角矩阵,其对角线元素是奇异值,V是n×n的正交矩阵。奇异值σ_i按照非降序排列,它们反映了矩阵A的信息量和重要性。 在VMD中,奇异值分解的作用在于识别信号的不同频率成分。当对信号进行VMD时,目标是找到最佳的K值,以使分解后的子带信号尽可能独立且无交叉。K值代表了分解得到的调制模式数量,每个模式对应一个特定的频率范围。 为了确定K值,我们需要分析SVD的结果,即奇异值的分布。奇异值的大小反映了原始信号的结构信息。通常,信号中的主要成分对应较大的奇异值,而噪声或不重要的成分对应较小的奇异值。因此,奇异值的下降趋势可以作为判断信号成分变化的一个指标。 通过绘制奇异值的累积贡献率曲线,我们可以观察到奇异值的显著下降点,这个点通常对应着信号主要成分的结束,后续的奇异值可以视为噪声或次要成分。这个显著下降点即为选择K值的依据。一般来说,选择奇异值曲线出现“转折”或者“平台”的位置作为K值,可以确保主要信号成分被保留,同时尽可能减少噪声的影响。 具体实现步骤如下: 1. 对信号进行SVD,得到奇异值序列。 2. 计算奇异值的累积贡献率,即将奇异值按降序排列后,每个奇异值除以所有奇异值的和,然后累加。 3. 绘制累积贡献率曲线,并寻找曲线的转折点或者平台区。 4. 将转折点对应的奇异值个数作为VMD的K值。 在实际应用中,确定K值还可以结合其他准则,如信息熵、能量集中度等,以确保分解的合理性和稳定性。此外,不同的信号和应用场景可能需要调整K值的选择策略,这需要根据具体问题进行细致的研究和实验验证。 总结来说,利用SVD确定VMD的K值是通过对奇异值分布的分析,找出信号主要成分与噪声之间的界限,从而选择一个合适的分解模式数量。这种方法有助于提取信号的关键特征,提高VMD分解的效率和准确性。。内容来源于网络分享,如有侵权请联系我删除。
常用护理技术操作规程49项.docx
局部阴影遮挡,灰狼MPPT,灰狼算法 灰狼算法实现部分遮阴的MPPT跟踪,包括光照突变情况,包括灰狼算法程序和matlab simulink模型的搭建,功率,电压,电流波形图和占空比波形图入如下。 ,局部阴影遮挡; 灰狼MPPT; 灰狼算法; 光照突变; 波形图; 程序搭建; matlab simulink模型,灰狼算法MPPT跟踪,局部遮阴及突变情况研究
XCP或者CCP标定,A2L标定文件,基于map文件自动更新A2L的地址和结构体变量的地址 源码基于C#需要开发,编译器为VS2022 ,XCP/CCP标定; A2L标定文件; 地图文件自动更新; C#开发; VS2022编译器,基于C#开发的XCP/CCP标定系统,自动更新A2L文件地址与结构体变量
给那些修改kof的玩家用的工具,简单快捷方便,需要自取
s10207-024-00818-y.pdf
Screenshot_20250314_152955.jpg
内容概要:本文档详细介绍了 FactSet 公司推出的 Truvalue V3 平台的内容采集与处理流程及其评分方法。FactSet 利用人工智能技术和语义大数据处理能力收集并解析每日超过4000万份来自20多万信源的全球ESG相关信息。通过对这些非结构化文本数据的深度剖析,Truvalue平台能够识别关键ESG主题并量化情绪倾向度。它不仅提供单篇文章层面的情绪打分(从最消极0到最积极100),而且还综合评估公司长期发展趋势以及短期市场表现。此外,还讨论了动态重要性和重点事件检测等特征,使分析师更容易捕捉到企业活动背后的潜在机会与风险。 适用人群:金融行业从业者如投资顾问、基金经理以及其他关注企业可持续发展和社会责任的专业人士。 使用场景及目标:为投资者提供精准的数据支持以进行资产配置决策;辅助研究员对特定企业或行业的深度调研工作。 其他说明:本方法论特别强调采用SASB标准作为评价基准之一,并解释了几种重要的得分计算公式,如脉搏分数、洞察力分数及时势动量指标等的具体运作机制。同时概述了一些质量控制措施以确保所提供数据的有效性和准确性。
毕业设计&课程设计 基于STM32单片机的物联网智能家庭安防系统(软件源码+硬件资料+部署教程+设计任务书+演示视频),高分项目,开箱即用 随着公众安全意识的提高,人们对家庭安全防控的需求愈发迫切,如何合理应用控制、通信及监控等自动化技术手段,打造智能化家庭安防系统成为研究重点。因此提出了基于物联网的家庭安防系统,实现监测燃气泄漏并报警、监测火灾烟雾并报警、检测非法入室并报警等功能,极大保障家庭居住场所的安全性。 用STM32单片机开发: 1、监测燃气泄漏(MQ-5)、监测火灾烟雾(DS18B20、MO-7)、检测非法入室(红外对管) 2、液晶显示燃气浓度、烟雾浓度、温度、是否有人闯入、布防状态 3、按键可以设置燃气、烟雾、温度的报警值,大于时候开启蜂鸣器报警以及对应的报警指示灯 4、当系统开启布防,有人闯入,开启蜂鸣器报警以及对应指示灯,撤防时,不检测非法闯入 5、数据通过wIFI上传到手机端 6、当报警时候发送报警短信,短信包含触发报警的情况:如燃气报警发送:gas leakage 温度或者烟雾报警发送:fire smoke alarm 非法入室发送:Illegal Entry
白胡椒检验表格(食品香辛料质量验收记录表)检验表格(食品香辛料质量验收记录表).docx
矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用
c++多媒体音视频播放器