• oracle 补齐两位小数(不足补0)


    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)需要总数位>小数位(即第一个参数的值需要>第二个参数的值)。

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/16017842.html
Copyright © 2020-2023  润新知