小弟毕业设计题目是与工业控制和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.数据导入/导出:处理经纬度坐标数据,小数位数精度很高,如: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
解决方案 »
- 如何将上传的文件保存到特定路径,并下载
- 请教,关于多编程所需注意的问题!!谢谢!!
- 简直气死了,大家看看,日期函数问题
- WebBrowser中比较棘手的问题(自动登录),请各位指点,一定高分
- 超简单问题:table或query组件怎么使用SQL server2000的数据库?
- 急!帮忙!
- 如何用ADO组件动态连接access数据库?
- 两次showmodel(在打开的窗体上再打开一个)后,再打开文件浏览器,会出现在第二个窗体之后,怎么办?
- chechy 请进来领分!! 谢谢!
- 用delphi怎样开发c/s架构的系统了?
- 如何调用这样的DLL
- ListView的OnChanging事件问题,我在Onchanging事件中校验输入,如果通过校验,则允许改变item
你说的字段类型是存在的,在设计表的时候可以使用,但是在导入数据的时候数据类型下拉框中没有【小数】这个选项,我的用的是OFFICE XP版本。导入成文本类型字段可以解决这个问题,大家帮忙再想想,多动手试试,分数多多的有哈。
2.数据显示处理:你在数据库里存的是116.4447,显示当然是116.4447,精度不会增加
access支持15位,主要是你的数据精度在导入时损失了
数据库里是我手工录入的15位小数116.44469100000001,这个你可以自己试试再用TADOQuery去取。
你的情況可以在
fieldbyname('num').AsFloat前 加上
fieldbyname('num').Size:= 試下!