问题出现:

   select round(1/300*100,4)||'%' from dual;

结果是: .3333%

现象: 个位0丢失

原因: oracle小于1的浮点转成字符时,丢掉前面0

解决:

 select concat(to_char(round(1/300*100,4),'fm990.9999'),'%') from dual;

fm表示去掉空格和后面的占位0

0表示在对应位置返回对应的字符,如果没有则以’0’填充.

9 表示在小数位,则表示转换为对应字符,如果没有则以0表示;在整数位,没有对应则不填充字符.

select to_char(.516,'fm999999990.9999999') from dual t; -- 0.516
select to_char(.516,'999999990.9999999') from dual t;   --          0.5160000   前面有空格,fm的作用就是去掉前面空格和后面的占位0
select to_char(.516,'fm999999990.000000') from dual t;  -- 0.516000
 
SELECT to_char(2,'fm00') FROM dual;                     -- 02
SELECT to_char(2,'fm9990.000000') FROM dual;            -- 2.000000
SELECT to_char(2,'fm9990.999999') FROM dual;            -- 2.      fm去掉前面的空格,同时还去掉了小数位的占位0
SELECT to_char(2,'9990.999999') FROM dual;              --      2.000000 
SELECT trim(to_char(2,'9990.999999')) FROM dual;        -- 2.000000 trim可以去掉前面的空格,并且保持勒后面的占位,避免 2. 没有 小数位0的情况