oracle 补齐两位小数(不足补0) 20256412编辑
Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注
资深码农+深耕理财=财富自由
欢迎关注

oracle 补齐两位小数(不足补0)
Created by Marydon on 2022-03-17 18:58
1.情景展示
在Oracle当中,进行加减乘除运算时,如何保留两位小数?
当不足两位小数时,如何进行补0?
2.具体分析
从数据源进行管控
如果是从数据源上进行管理,我们可以直接定义要保存的数据的格式(需要几位小数)提前定义好。
比如,规定数据格式为:保留两位小数。
number(10,2)代表的含义是:整数位+小数位<=10且小数位=2(言外之意就是:整数位需要<=8)。
我们可以看到:当我们插入的数据不足两位小数时,将会自动用0补够;
当插入的数据小数位超过要保留的位数时,会自动对小数位进行四舍五入操作。
另外,关于number类型,还有一个特性:
当整数部分最前面有0时,Oracle会自定将其删除,这个java的int/long数据类型一样,都无法在整数前面加0;
如果,我们需要在整数最前面补零的话,可以将数据类型改成varchar2。
基于现有数据的管控
即使,我们按照上面的规矩对数据进行了约束,但是,一旦我们需要进行除法运算,除不尽或者小数位超过两位的情况很常见;
下面,会着重介绍,这类现象的解决方案。
3.解决方案
保留两位小数的两种方式:trunc()与round()
trunc()函数
用途:单纯地对数字进行截取处理,不做四舍五入操作
语法:TRUNC(number[,decimal_places])
参数说明:
number 待做截取处理的数值
decimal_places 指明需保留小数点后面的位数。可选项,不带该参数时,截去所有的小数部分。
举例:
--情景1:参数带小数,不带第2个参数 SELECT TRUNC(123) FROM DUAL;--123 SELECT TRUNC(123.98) FROM DUAL; --123 --情景2:参数是整数,保留1位小数 SELECT TRUNC(123, 1) FROM DUAL; --123 --情景3:参数带小数,保留2位小数 SELECT TRUNC(123.123, 2) FROM DUAL; --123.12 --情景4:参数带小数,保留4位小数 SELECT TRUNC(123.123, 4) FROM DUAL;--123.123 --情景5:保留到十位 SELECT TRUNC(123.123, -1) FROM DUAL; --120 SELECT TRUNC(123, -1) FROM DUAL; --120 --情景6:保留到小数点前 5位 SELECT TRUNC(123.123, -5) FROM DUAL; --0
用法:
1.不带第二个参数,默认只保留整数位,不做四舍五入操作,单纯截取;
2.带第二个参数:
2.1 当参数为正数时:
2.1.1 当要保留的小数位 < 要截取的小数位数时,直接截取;
2.1.2 当要保留的小数位 >= 要截取的小数位数时,返回原数字。
2.2 当参数为负数时:
2.2.1 当要保留的整数位 < 要截取的整数位数时,从整数的个位倒序(个,十,百...位)直接截取;
2.2.2 当要保留的整数位 >= 要截取的整数位数时,返回0。
round()函数
用途:和tranc()函数的用法大致相同,不同的是:使用该函数会以四舍五入的方式进行截取。
语法:ROUND(number[,decimal_places])
参数说明:
number 待做截取处理的数值
decimal_places 指明需保留小数点后面的位数。可选项,不带该参数时,截去所有的小数部分。
方式一:to_char()函数
to_char()可以使用9或0,对数字进行格式化处理。
0:在对应位置返回对应的字符,如果没有则以'0'填充;
注意,这是一个强制的符号:对应位没有,则以'0'填充(包括整数部分)。
9:在小数位,则表示转换为对应字符;如果没有,则以0表示。(只对小数部分有效:在整数位,没有对应,则不填充字符)。
使用to_char()函数,0或9进行格式化的弊端:
第一,会在格式化后的数据前面产生空格。
需要使用trim()函数进行去除
第二,使用9进行格式化小数时,如果整数部分全部为0,将会出现错的结果;
需要使用decode()函数对0进行单独处理
第三,整数部分的格式化位数必须<=整数部分的位数,否则返回#
注意事项:对于0和9而言,如果格式的位数<数字的位数,会返回'#'.
譬如to_char(12345,'9999')将会得到:'#####'。
另外,当数值的小数位数>要格式化(保留)的小数位时,会自定按照四舍五入处理。
语法小结:
保留两位小数,不进行四舍五入
decode(column, 0, '0.00', trim(to_char(trunc(column, 2), '9999999.99')))
保留两位小数,进行四舍五入
decode(column, 0, '0.00', trim(to_char(column, '9999999.99')))
或者
decode(column, 0, '0.00', trim(to_char(round(column, 2), '9999999.99')))
如果需要对整数位进行补零操作,我们可以使用:
decode(column, 0, '00.00', trim(to_char(column, '00.99')))
我们知道使用0进行格式化,整数部分<格式化的整数部分位数时,会自动整数部分补零;
但是,我们可以利用number类型的特性(整数最前面不能带0)来将最前面的0过滤掉。
decode(column, 0, 0.00, trim(to_char(column, '00.99')))
这个方法的关键点在于:0.00,它将trim(to_char())函数结果转成了number类型。
说明:不管是用0还用9进行格式化时,只要确保对整数部分进行格式化是,0或9的整数部分个数>=整数部分的位数。
方式二:cast()函数
语法:cast(column as number(最大位数, 小数位数))。
当数值的小数位数>要格式化(保留)的小数位时,会自定按照四舍五入处理。
说明:number(total, remainder)需要总数位>小数位(即第一个参数的值需要>第二个参数的值)。
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
相关推荐:
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/16017842.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-03-17 Jackson无法将LocalDateTime序列化成字符串的解决办法