【发布时间】:2013-04-12 10:14:02
【问题描述】:
我正在使用 postgresql。我的数据库中的表具有类型为 REAL 的列。当实际值具有超过七个零时,postgresql 将其存储为例如 1e+007。当通过查询检索时,值返回也为1e+007.但我需要值为 10000000 .什么是解决方案
【问题讨论】:
标签: sql database postgresql-9.1
我正在使用 postgresql。我的数据库中的表具有类型为 REAL 的列。当实际值具有超过七个零时,postgresql 将其存储为例如 1e+007。当通过查询检索时,值返回也为1e+007.但我需要值为 10000000 .什么是解决方案
【问题讨论】:
标签: sql database postgresql-9.1
如果您将浮点数用于它们不适合的事物,您将遇到更多的问题,包括几乎所有您关心数字的确切表示的事物。
我建议您使用NUMERIC,这是一种以 10 为底(十进制)的数字数据类型,可让您控制精度和比例。见Numeric types。 NUMERIC 执行计算速度较慢并消耗更多存储空间,因此它并不总是正确的答案,但它是许多应用程序的理想选择。
你可以使用浮点数,只是更难,因为你不能安全地比较精确相等,必须使用舍入和格式化函数来显示,等等。
例子:
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。这是金融应用程序中的一种常见技术,尽管现在使用适当的十进制数据类型更为常见。
【讨论】:
使用 SQL CAST。在 DB2 中为我工作
select cast(cast(1e+007 as real) as decimal (15,2)) from sysibm.sysdummy1;
10000000.00
您可以根据需要设置小数位数 (15,0)。
【讨论】:
sysdummy1 部分,它也应该可以在 Postgres 中使用。
select to_char(1e+007::real, '9999999999')
手册中的更多详细信息:http://www.postgresql.org/docs/current/static/functions-formatting.html
【讨论】: