正在紧急对应一个bug现象:  统计数据库中的某一列的和,假设这一列为  column1
select sum(column1) from table where ...
问题:当累计的和超过15位时,sum出来的值不准确。比如说实际应该是9999999999999999
sum出来的结果是 1.0e17,也就是说多增加了1.
急求在sql中的解决方案。
谢谢。

解决方案 »

  1.   

    是PL/SQL查的,java程序里打断点调试后 也是同样的结果。
      

  2.   


    scott@ORCL10G> column sum_sal for 999999999999999
    scott@ORCL10G>  select sum(sal)+99999999999999 as sum_sal from emp;         SUM_SAL
    ----------------
     100000000028674已选择 1 行。scott@ORCL10G> 
      

  3.   

    scott@ORCL10G>  column sum_sal for 999999999999999.999
    scott@ORCL10G> select sum(sal)+99999999999999 as sum_sal from emp;             SUM_SAL
    --------------------
     100000000028674.000已选择 1 行。scott@ORCL10G> 
      

  4.   

    如楼上的,结果出现了问题,这有点像java里的double精度问题,当double超过15位时,值就不会准确。在java里,计算时,可以通过BigDecimal类,在oracle里怎么办?
      

  5.   

    存放金额的,定义为varchar(16),虽然定义为varchar,但里面要不是数字,要不就是null
      

  6.   

    大家可以用excel试下求和,求下 9999999999999999+9999999999999999  计算出来的值也不是完全准确的。
      

  7.   

    存放金额的字段竟然用varchar...
    精度问题,自动进位
      

  8.   


    select cast(sum(column1) as number(16)) from table where 
    这个怎么样你定义的长度才16位,包含几位小数?
      

  9.   

    cast(sum(column1) as number(20,2)) 
      

  10.   

    select sum(to_number(columnname)) from table;
      

  11.   

    這個夠大
    cast效率比to_number好
      

  12.   

    select sum(to_number(columnname)) from table; 这个不行,
    我试下 cast(sum(column1) as number(20,2)) 这个。
      

  13.   

    不行的话用这个吧
     to_char(sum(column1),99999999999999999.99)
    自己修正小数点前后的'9'的位数
      

  14.   

    cast(sum(column1) as number(20,2)) 不好使,
    不过 to_char(sum(column1),99999999999999999.99) 个好像好使,就不知道会有没有什么特殊情况。
      

  15.   

    一般不会有什么问题
    输出的是字符型数据
    可能会包含空格,不要空格的话
    to_char外加个trim函数过滤掉
      

  16.   

    根据业务,这个sum出来的结果 的位数 最大为16位,即16个9,而且只有可能为整数,那么我这样写应该没问题吧。
    to_char(sum(column1),'9999999999999999') .
    还有一个问题就是  sum计算出来的值其实是对的,只不过是 它进行了隐式转换,可以这样认为吗,谢谢大家,一会马上结贴。