小数点前的0的显示问题

 在处理数据时发现一个问题,Oracle对于小于1的小数,小数点前面的0是不显示的。
 
SQL> create table t1_number (num number);
Table created
 
SQL> insert into t1_number values(0.3268);
1 row inserted
 
SQL> insert into t1_number values(0.57965686);
1 row inserted
 
SQL> insert into t1_number values(52345234.5686);
1 row inserted
 
SQL> insert into t1_number values(4.552686);
1 row inserted
 
SQL> commit;
Commit complete
 
SQL> column num format 99999999999.9999999999999
SQL> select * from t1_number;
 
                       NUM
--------------------------
            .3268000000000
            .5796568600000
    52345234.5686000000000
           4.5526860000000
 
 
 
    使用PL/SQL DEV工具查看时是有前面的0的
    通过column num format 000000000000.99999999999设置也可以显示前面的0
 
    但是这些都只是显示的结果,而不是数据库保存结果
 
SQL> column num format 00000000000.9999999999999
SQL> select * from t1_number;
 
                       NUM
--------------------------
 00000000000.3268000000000
 00000000000.5796568600000
 00052345234.5686000000000
 00000000004.5526860000000
 00000000005.2920000000000
 
SQL> select substr(num,1,1) from t1_number;
 
SU
--
.
.
5
4
5
 
    可以看到,无论前面出现多少位,通过substr函数获取的第一位任然是'.'
 
 
    无论怎么转换,只要最终输出结果是数值型的,小数点前的0必然被丢弃,所以只有将数值转换为字符型,大致有两种方法:
 
 
1、直接使用to_char函数
 
    首先实验一下将小数点前和小数点后都加上99999999的格式:
 
SQL> select to_char(num,'999999999.999999999') from t1_number;
 
TO_CHAR(NUM,'9999999
--------------------
          .326800000
          .579656860
  52345234.568600000
         4.552686000
         5.292000000
 
    发现小数点前还是没有0,而小数点后的0多出来了
    再实验一下小数点前和小数点后都加上0000000000格式:
 
SQL> select to_char(num,'00000000000.000000000') from t1_number;
 
TO_CHAR(NUM,'000000000
----------------------
 00000000000.326800000
 00000000000.579656860
 00052345234.568600000
 00000000004.552686000
 00000000005.292000000
 
    发现小数点前是有0了,但是两边的0都多出来了,使用FM来去掉多于的0:
 
SQL> select to_char(num,'fm00000000000.000000000') from t1_number;
 
TO_CHAR(NUM,'FM0000000
----------------------
00000000000.326800000
00000000000.579656860
00052345234.568600000
00000000004.552686000
00000000005.292000000
 
    没有效果,说明FM只能去掉用9表示的格式中产生的0:
 
SQL> select to_char(num,'fm999999999.999999999') from t1_number;
 
TO_CHAR(NUM,'FM99999
--------------------
.3268
.57965686
52345234.5686
4.552686
5.292
 
    但是这样还是没有0,最后发现可以将小数点前的第一位置为0即可(注意9的个数要大于数值的位数):
 
SQL> select to_char(num,'fm999999990.999999999') from t1_number;
 
TO_CHAR(NUM,'FM99999
--------------------
0.3268
0.57965686
52345234.5686
4.552686
5.292
 
    检查一下第一位,没有问题:
 
SQL> select substr(to_char(num,'fm999999990.999999999'),1,1) from t1_number;
 
SU
--
0
0
5
4
5
 
 
2、使用decode函数
 
    既然小于1的小数首位必然是'.',那就判断首位是否为'.',是则在前面加上'0'即可
 
SQL> select decode(substr(num,1,1),'.','0'||num,num) from t1_number
 

DECODE(SUBSTR(NUM,1,1),'.','0'||NUM,NUM)
-----------------------------------------
0.3268
0.57965686
52345234.5686
4.552686
5.292
 
    同样检查一下第一位,没有问题
 
SQL> select substr(decode(substr(num,1,1),'.','0'||num,num),1,1) fro
m t1_number;
 
SU
--
0
0
5
4
5
 
 
    也可以写个函数来判断一下,不过可以用decode直接出来,感觉也没什么必要,暂时就这些吧。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在shell中,可以使用printf命令来格式化输出小数。为了显示小数点的0,可以在格式字符串中使用0标志,如下所示: ``` printf "%.3f\n" 0.123 ``` 其中,%.3f表示输出浮点数,并保留3位小数,0表示填充0,\n表示输出一个换行符。执行上述命令后,会输出0.123。如果要输出0.00123,可以将格式字符串改为%.5f。 ### 回答2: 在shell中,要显示小数点的0,可以使用printf命令来实现。具体的做法是,在printf中使用格式化字符串来控制输出的格式。 示例代码如下: ``` num=0.12345 # 假设要显示小数点的0的数值 printf "%d\n" $num ``` 在上述代码中,使用printf命令来输出num变量的值。%d是printf的格式化字符串,用于输出整数部分。在这个例子中,我们将$num变量以整数的形式输出。由于整数部分是0,所以会显示0。输出结果为: ``` 0 ``` 通过这样的方式,就可以在shell中显示小数点的0了。需要注意的是,这种方法只能用来显示小数点的0,对于小数点后的位数,需要额外的处理。 ### 回答3: 在shell中,如果要显示小数点的0,可以使用printf命令或者使用bc命令来实现。 1. 使用printf命令: ```shell num=0.123 # 假设一个小数 printf "%.3f\n" $num ``` 上述代码中的%.3f表示格式化输出浮点数,其中3表示小数点后面保留几位小数。使用printf命令将会输出:0.123(小数点有一个0)。 2. 使用bc命令: ```shell echo "scale=3; $num" | bc ``` 上述代码中的scale=3表示保留3位小数。使用bc命令将会输出:0.123(小数点有一个0)。 总结:通过printf命令的格式化输出或者使用bc命令进行计算并显示保留指定位小数的方法,可以在shell中显示小数点的0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值