字符串类型的 4195.40 转成 浮点型 ,结果发现不对,请问这是什么问题,有什么解决办法吗
select '4195.40' :: FLOAT
你给出的结果是因为使用了不精确类型被PG把结果改写了。
建议理解一下postgresql的几种浮点型,避免以后使用上踩坑。
Postgresql提供四类浮点型,按功能看可以分成两类:
关于float(n)的写法,文档8.1.3节有详细解析:http://www.postgres.cn/docs/14/datatype-numeric.html
用这个就好喽
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 转换
结果如图:
涉及金额等对精度要求比较高的数据,建议使用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类型具有足够的精度来保留结果。
```