ROUND( number, [ decimal_places ] )
number : 需处理的数值
decimal_places : 四舍五入 , 小数取几位 ( 预设为 0 )
SELECT ROUND (123.456) FROM DUAL; -- 四舍五入取整 ,返回123
SELECT ROUND (0.456,2) FROM DUAL; --作用保留两位小数,返回0.46
SELECT ROUND (0.456,2)||'%' FROM DUAL; --想要显示的结果为0.46%,但实际显示结果为 .46%,这是由于Oracle中数字转为字符串时舍弃了以0起始的整数位部分
--关联测试
SELECT TO_CHAR (0.456) FROM DUAL --直接数字转字符串,返回.456
SELECT '%'||0.456||'%' FROM DUAL --返回%.456%
--可见当oracle 判断出该列为字符串格式的时候,先进行的是格式转换(即由0.456 数字型转为.456字符串类型),再进行拼接。
--正常显示0.46%的方式 使用格式化字符串TO_CHAR(number,'fm999999999.99')
--比较观察下面两种输入fm后的值及返回的结果
SELECT TO_CHAR(ROUND (0.456,2),'fm999999999.99') FROM DUAL; --返回结果 .46
SELECT TO_CHAR(ROUND (0.456,2),'fm999999990.99') FROM DUAL; --返回结果 0.46
--关键在于小数点前格式字符时是0还是9;再看一个例子
SELECT TO_CHAR(0.4,'fm999999990.99') FROM DUAL; --返回结果 0.4
SELECT TO_CHAR(0.4,'fm999999990.90') FROM DUAL; --返回结果 0.40
--这样可以很明显的看出格式字符串中0和9格式化后的区别,即当为数值位上为0时需要显示的则格式字符串上该位置为0,无需显示的为9
PS:若有任何其他见解请留言,大家共同进步探讨,谢谢!