sqlserver浮点数float转换成double,怎么解决?

chenqipan 2013-10-08 01:51:02
关于sqlserver只有float,然后java的
org.apache.commons.dbutils.QueryRunner qr = new QueryRunner();
List results = (List) qr.query(conn, sql);
得到的结果集只有Double,无法装箱成Float,精度损失,大家有没有遇到过?
所以每次页面上显示一长条的尾巴235.49999999999997,数据库里面是235.5


org.apache.commons.dbutils.QueryRunner来自commons-dbutils-1.3.jar

有没有人用过?
...全文
1131 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
supercboy 2013-12-17
  • 打赏
  • 举报
回复
不知道你的编程语言里有没有Currency类型,你可以把其转换为Currency类型就可以精确表示了。千万不要用Float进行精确比较,因为很多时候你是得不到你想要的结果的,这和Float存储表方式有关。
KeepSayingNo 2013-11-23
  • 打赏
  • 举报
回复
我一般对于这种小数,都是在数据库中用的real类型,这个话java无论用double还是float解析都OK
LongRui888 2013-11-22
  • 打赏
  • 举报
回复
引用 5 楼 chenqipan 的回复:
用了框架 org.apache.commons.dbutils.QueryRunner qr = new QueryRunner(); String sql="select x from tab_abc"; List<Map> results = (List<Map>) qr.query(conn, sql); double x = (Double)results.get(0).get("x"); //float x = (Float)results.get(0).get("x");数据库中是float类型 //java.lang.Double cannot be cast to java.lang.Float 我想是框架封装时自动转成double类型的 java允许隐式float->double,double->float需要强转,这是我们都知道的 那么为什么上面强转还是报错呢? 原因是: float->double,double->float 都是基本类型 基本类型之间可以转化 Float->Double,Double->Float 都是引用类型 引用类型除非是父子关系,否则无法强转 所以该框架封装时自动转成Double引用类型,而不是double基本类型 然后: 说回实际开发, 话说你们是如何操作小数的?float和double每一毫秒都可能出现偏差的啊 float和double类型的主要设计目的是为了科学计算和工程计算。它们执行二进制浮点运算,所以不应该被用于要求精确结果的场合。 作为一款正常的软件,追求的肯定是精确的数据,所以推荐使用 BigDecimal来处理小数的问题, 对于整数,不是大数的话,我们的程序里还是充满了int和long的,这是没问题的 所以嘛,以后打死不用浮点数了,这么坑啊, BigDecimal才是我的希望!!!
float和double确实不精确,所以一般都用numeric或者decimal(两个是同义词),最大可以表示10的38次方的整数,或者是相应的小数。
chenqipan 2013-11-22
  • 打赏
  • 举报
回复
用了框架 org.apache.commons.dbutils.QueryRunner qr = new QueryRunner(); String sql="select x from tab_abc"; List<Map> results = (List<Map>) qr.query(conn, sql); double x = (Double)results.get(0).get("x"); //float x = (Float)results.get(0).get("x");数据库中是float类型 //java.lang.Double cannot be cast to java.lang.Float 我想是框架封装时自动转成double类型的 java允许隐式float->double,double->float需要强转,这是我们都知道的 那么为什么上面强转还是报错呢? 原因是: float->double,double->float 都是基本类型 基本类型之间可以转化 Float->Double,Double->Float 都是引用类型 引用类型除非是父子关系,否则无法强转 所以该框架封装时自动转成Double引用类型,而不是double基本类型 然后: 说回实际开发, 话说你们是如何操作小数的?float和double每一毫秒都可能出现偏差的啊 float和double类型的主要设计目的是为了科学计算和工程计算。它们执行二进制浮点运算,所以不应该被用于要求精确结果的场合。 作为一款正常的软件,追求的肯定是精确的数据,所以推荐使用 BigDecimal来处理小数的问题, 对于整数,不是大数的话,我们的程序里还是充满了int和long的,这是没问题的 所以嘛,以后打死不用浮点数了,这么坑啊, BigDecimal才是我的希望!!!
Cloud_Hero 2013-10-09
  • 打赏
  • 举报
回复
float和real是不精确的数据类型,double同样也是。 decimal和numeric才是精确的数据类型。
LongRui888 2013-10-08
  • 打赏
  • 举报
回复
你的意思是数据是存储在sql server里面,字段类型是float的235.5,但到了java里的double类型,就变成了一长串是把,但在java应该也有float类型的吧。 实在不行,就把数据库里的类型改为numiric(30,2)
發糞塗牆 2013-10-08
  • 打赏
  • 举报
回复
先把float转换成decimal 或者 numeric试试
--小F-- 2013-10-08
  • 打赏
  • 举报
回复
JAVA里面有没有DECIMAL? 还有一种处理办法是乘以10 然后输出结果的时候除以10

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧