本文介绍了去除小数雪花后的尾随零的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试从小数点后的数值列中删除尾随零。例如:

0.978219150000 -> 0.97821915
0.650502591918 -> 0.650502591918
0.975479450000 -> 0.97547945

数据类型为数字(38,12)。有没有办法去掉我上面提到的尾随零?

推荐答案

您可以尝试强制转换为浮点:

create or replace table test (a NUMBER(38,12));
insert into test values (0.97821915), (0.650502591918), (0.975479450000);

select a from test;
+----------------+
|              A |
|----------------|
| 0.978219150000 |
| 0.650502591918 |
| 0.975479450000 |
+----------------+

select a::float from test;
+--------------+
|     A::FLOAT |
|--------------|
| 0.97821915   |
| 0.6505025919 |
| 0.97547945   |
+--------------+

但是,根据您要实现的目标,由于潜在的舍入问题,使用浮点数可能不是一个好主意。

更新:

我尝试了regexp版本,不确定是否遗漏了任何测试用例:

create or replace table test (a NUMBER(38,12));
insert into test values
    (0.97),
    (0.650502591918),
    (0.975479450000),
    (10000),
    (1450000),
    (12.2000),
    (14.0200);

select regexp_replace(
    a::varchar,
    '^([0-9]+)$|' ||
    '^([0-9]+).0*$|' ||
    '^([0-9]+.[0-9]{1,}[1-9])0*$|' ||
    '^([0-9]+.[1-9])0*$', '\1\2\3\4'
) as a from test;

+----------------+
| A              |
|----------------|
| 0.97           |
| 0.650502591918 |
| 0.97547945     |
| 10000          |
| 1450000        |
| 12.2           |
| 14.02          |
+----------------+

其中:

^([0-9]+)$                   -> will cover the integer like 10000
^([0-9]+).0*$               -> will cover integer like 10.000000
^([0-9]+.[0-9]{1,}[1-9])0*$ -> will cover 14.0200000
^([0-9]+.[1-9])0*$.         -> will cover 12.20000 or 0.97540000

这篇关于去除小数雪花后的尾随零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 10:52