小弟毕业设计题目是与工业控制和GIS行业数据库系统,但是不是一般的管理系统,侧重在数据统计和分析,里面用了大量的算法,当然这些核心问题已经在老师的帮助下解决了。目前在数据分析处理的时候遇到一个比较麻烦的问题,相信在相关行业工作的XDJM可能都遇到过,我花了两天时间在网上找答案,但是还是没有得到令人满意的结果。问题描述如下:
1.数据导入/导出:处理经纬度坐标数据,小数位数精度很高,如:fX = 116.44469100000001, fY = 39.876517999999997,老师给我的是一个从其他数据库导出的文本文件,而我的程序用的是ACCESS桌面数据库,从文本文件导入进来时候就在精度上出现问题,好象不能设置导入小数类型,最多也就是双精度类型,所以最终结果变成了fX = 116.4447, fY = 39.8765,精度损失很严重,我目前还是通过自己建立小数类型字段,精度为19,小数位数为15,不知道ACCESS最大可以支持多少精度的小数,然后手工录入一些数据进行测试,但是文本文件里面有1W多条记录,全部这样做可能到答辩都弄不好,并且保证没有精度损失?有没有什么办法解决这个数据导入的问题?还有就是SQL Server是不是也有相似的问题?
2.数据显示处理:有了一写测试数据以后,我在取数据的时候用的是TADOQuery,但是还是出现了很麻烦的问题,代码如下:
Double dX = ADOQuery1.FieldByName('fX').AsFloat; 
Double dY = ADOQuery1.FieldByName('fY').AsFloat; 
/* 跟踪到这里的时候,AsFloat取出的值在赋给dX和dY的时候就分别变成了116.4447和39.8765,这个问题我搜了很多文章,包括以前CSDN上的帖子,有人说是编译器显示上的问题,那么我就尝试用占位符的方式用字符串显示结果,结果FormatFloat('########0.000000000000000', ADOQuery1.FieldByName('fX').AsFloat)变成了116.444700000000000,精度已经完全损失,那么转换成的字符串实际上已经是没有意义的了,如果使用下面的代码:*/
String strX = ADOQuery1.FieldByName('fX')->AsString; 
String strY = ADOQuery1.FieldByName('fY')->AsString; 
/* 结果仍然还是依旧,我后来想数据类型应该还是默认转换了,走这条路也行不通 */
3.这些问题是否还和环境有关系?小弟编程经验不多,很多地方都不明白,希望指点。以上就是小弟遇到的这些麻烦的问题,主要就是数据导入/导出时候遇到的精度损失问题,还有就是通过ADO取数据时遇到的精度损失问题,两大问题相信很多高手都遇到过,由于涉及的行业对数据精度要求很高,毕业答辩在即,小弟在此高分求解,希望能得到高手的帮助,并且如果能将这些问题的原因一并进行分析最好,感谢大家了!BCB页面相同问题链接:http://community.csdn.net/Expert/topic/4808/4808839.xml?temp=.4235193

解决方案 »

  1.   

    Access中用数值-小数,最多小数点后15位
      

  2.   

    to Rubi(学程序用来混饭吃,根据马洛斯的人的需求分析,本人现) :
        你说的字段类型是存在的,在设计表的时候可以使用,但是在导入数据的时候数据类型下拉框中没有【小数】这个选项,我的用的是OFFICE XP版本。导入成文本类型字段可以解决这个问题,大家帮忙再想想,多动手试试,分数多多的有哈。
      

  3.   

    1.数据导入/导出:如果access的导入/导出不行,那就只好自己写一个了
    2.数据显示处理:你在数据库里存的是116.4447,显示当然是116.4447,精度不会增加
    access支持15位,主要是你的数据精度在导入时损失了
      

  4.   

    to Kerry80(大梦永不醒):
        数据库里是我手工录入的15位小数116.44469100000001,这个你可以自己试试再用TADOQuery去取。
      

  5.   

    我用sql server2000 試了一下 不會出現你說的情況,我輸入的是3.14159265875152  查出來的結果也是這個!
    你的情況可以在
    fieldbyname('num').AsFloat前 加上
    fieldbyname('num').Size:= 試下!