【问题标题】:Formatting real value returned by query from a database格式化从数据库查询返回的实际值
【发布时间】:2013-04-12 10:14:02
【问题描述】:

我正在使用 postgresql。我的数据库中的表具有类型为 REAL 的列。当实际值具有超过七个零时,postgresql 将其存储为例如 1e+007。当通过查询检索时,值返回也为1e+007.但我需要值为 10000000 .什么是解决方案

【问题讨论】:

    标签: sql database postgresql-9.1


    【解决方案1】:

    如果您将浮点数用于它们不适合的事物,您将遇到更多的问题,包括几乎所有您关心数字的确切表示的事物。

    我建议您使用NUMERIC,这是一种以 10 为底(十进制)的数字数据类型,可让您控制精度和比例。见Numeric typesNUMERIC 执行计算速度较慢并消耗更多存储空间,因此它并不总是正确的答案,但它是许多应用程序的理想选择。

    可以使用浮点数,只是更难,因为你不能安全地比较精确相等,必须使用舍入和格式化函数来显示,等等。

    例子:

    regress=> select '1.2'::float8 - '1.0'::float8;
           ?column?       
    ----------------------
     0.199999999999999956
    (1 row)
    
    regress=> select '1.2'::numeric - '1.0'::numeric;
     ?column? 
    ----------
          0.2
    (1 row)
    

    此类问题的另一个常见解决方案是使用应用程序定义的定点表示。如果您需要(比如说)2 位小数,您只需将数字2000.11 存储为数据库中的200011,然后乘以100。这是金融应用程序中的一种常见技术,尽管现在使用适当的十进制数据类型更为常见。

    【讨论】:

      【解决方案2】:

      使用 SQL CAST。在 DB2 中为我工作

      select cast(cast(1e+007 as real) as decimal (15,2)) from sysibm.sysdummy1;
      10000000.00
      

      您可以根据需要设置小数位数 (15,0)。

      【讨论】:

      • 如果你省略了sysdummy1 部分,它也应该可以在 Postgres 中使用。
      【解决方案3】:
      select to_char(1e+007::real, '9999999999')
      

      手册中的更多详细信息:http://www.postgresql.org/docs/current/static/functions-formatting.html

      【讨论】:

      • 如果要转换的值超过10个地方,常见的解决办法是什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2018-10-26
      • 1970-01-01
      • 2011-05-23
      • 2012-11-21
      • 2016-12-31
      • 2012-10-08
      相关资源
      最近更新 更多