近期在使用oracle to_char函数处理浮点数时发现有坑,这里做个小结:
网上可以找到关于to_char中使用fm9990.0099中的相关解释:
- 0表示:如果参数(double或者float类型)存在数字就显示数字,不存在数字就显示0
- 9表示:如果参数(double或者float类型)存在数字就显示数字,不存在数字就显示空格
- FM表示:将9带来的空格删除
-
- 下面通过具体代码进行相关验证
- --SQL示例代码:
With Tmp As- (Select 2312320.012 n From dual Union All
- Select 0.012322 n From dual Union All
- Select 0.012564 n From dual Union All
- Select -0.012 n From dual Union All
- Select -10023 n From dual Union All
- Select 8989898 n From dual)
- Select --全部为 9
- To_Char(t.n, '9999999999.9999999') all_9,
- --全部为 9 同时使用 FM
- To_Char(t.n, 'FM999999999999999.9999999') all_FM9,
- --全部为 0
- To_Char(t.n, '000000000.0000000') all_0,
- --全部为 0 同时使用 FM
- To_Char(t.n, 'FM000000000.0000000') all_FM0,
- --个位开始向右使用 0 向左使用9
- To_Char(t.n, '9999999990.0000000') some9one0,
- --个位开始向右使用 0 向左使用9 同时使用FM
- To_Char(t.n, 'FM999999999999990.00000000') some9one0P0_FM,
- --个位使用 0 同时使用FM
- To_Char(t.n, 'FM999999999999990.99999999') some9one0P9_FM,
- --个位使用 0 前四位小数位使用 0 同时使用FM
- To_Char(t.n, 'FM999999999999990.0000999') some9one0P09_FM
- From tmp t;
- --执行结果:
--总结:
1、9在不同的地方可能会使用不同的占位符:整数位使用空格;小数位有有效数时使用0,无有效数时使用空格;
2、9对于绝对值小于1的小数的个位会处理成空格
3、FM只能用来删除9所产生的多余的占位符(空格或0),对于0产生的占位符无效。
--思考:
四舍五入可以通过控制9或0的个数实现。