数据库转换数据不对问题

字符串类型的 4195.40 转成 浮点型 ,结果发现不对,请问这是什么问题,有什么解决办法吗

select '4195.40' :: FLOAT

你给出的结果是因为使用了不精确类型被PG把结果改写了。
建议理解一下postgresql的几种浮点型,避免以后使用上踩坑。

  1. Postgresql提供四类浮点型,按功能看可以分成两类:

  2. 关于float(n)的写法,文档8.1.3节有详细解析:http://www.postgres.cn/docs/14/datatype-numeric.html

    • PostgreSQL还支持 SQL 标准表示法float和float§用于声明非精确的数字类型。在这里,p指定以二进制位表示的最低可接受精度。 在选取real类型的时候,PostgreSQL接受float(1)到float(24),在选取double precision的时候,接受float(25)到float(53)。在允许范围之外的p值将导致一个错误。没有指定精度的float将被当作是double precision。

用这个就好喽

SELECT ROUND(CAST('4195.40' AS NUMERIC(10, 2)) * 1000000, 0);



望采纳


select '4195.40'::float as result

是select CAST("4195.40" AS DECIMAL(8,2)); 这个结果再 * 1000000 吧

用 select ('4195.40' :: decimal) * 1000000 转换
结果如图:

img

涉及金额等对精度要求比较高的数据,建议使用decimal类型。使用select ('4195.40' :: decimal)。
如果有用,望采纳,谢谢!

该回答引用ChatGPT
请参考下面的解决方案,如果有帮助,还请点击 “采纳” 感谢支持!

字符串类型 '4195.40' 转成浮点型 '4195.40' :: FLOAT 并不能保证转换后的结果精确,这是因为浮点数在计算机内部存储时可能与实际值存在一定的误差。在本例中,该误差可能导致计算的结果不正确。

解决方法是使用精确数字类型,例如 NUMERIC 或 DECIMAL,而不是 FLOAT。例如:

SELECT ('4195.40' :: NUMERIC) * 1000000;

这将确保转换后的数字精确,从而避免浮点误差问题。

很可能是精度问题。FLOAT类型的精度是有限的,并且在数字变大时可能会发生精度丢失。因此,将FLOAT类型乘以1000000后得到的结果可能不是您所期望的。

解决办法是使用DECIMAL类型,该类型具有更高的精度。例如:


```sql
SELECT ('4195.40' :: DECIMAL(10,2)) * 1000000


这应该返回正确的结果,因为DECIMAL类型具有足够的精度来保留结果。

```