All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
实例:在ASP.NET中创建使用全球唯一标识符_.net资料_编程技术
ASP.NET中实现模版的动态加载_[Asp.Net教程]
ASP.NET,2.0,中的,Theme,功能_.net资料_编程技术
delphi无类型文件
ASP.NET技术中常见问题详细解答及代码_[Asp.Net教程]
构建安全的Xml,Web,Service系列
点击gridview的删除按钮弹出确认消息框_[Asp.Net教程]
SQL数据库完全手册_mssql学习_编程技术
《Effective,C#》:值类型和引用类型_[Asp.Net教程]
SQL,Server的恢复模式_mssql学习_编程技术
Reading number is top 10 pictures
NeedWallpaper9
小学生考试又现神作--还有外国的
支持判处贩卖儿童者死刑
I also want to live a June 1 children's day, dad
可爱的狗熊们
The world first motorcycle will be auctioned for 21000 pounds
中国女孩大胆自拍,显露完美身材4
29 the belle stars after bath figure3
Magnificent cloud1
Born After 90 Beijing sports university campus flower photos2
Download software ranking
Sora aoi's film--cangkong_Blue.Sky
Macromedia Dreamweaver 8
少妇苏霞全本
塘西风月痕
尖东毒玫瑰B
Tram sex maniac 2 (H) rar bag18
ASP.NET.2.0.XML.高级编程(第3版)
小黑猫大战两米大花蛇
实战黑客不求人
卡丁车单机版
aaa published in(发表于) 2013/12/18 7:50:31 Edit(编辑)
.Net业务平台的数值精度陷阱与解决方法_.net资料_编程技术

.Net业务平台的数值精度陷阱与解决方法_.net资料_编程技术

.Net业务平台的数值精度陷阱与解决方法_.net资料_编程技术-你的首页-uuhomepage.com

本文主要介绍一下.Net业务平台的数值精度陷阱与解决方法。


  本文主要介绍一下.Net业务平台的数值精度陷阱与解决方法。


  最近公司的实施人员反映,数量小数位保留3位精度不够,需要保留6位才行,回想起这个问题,公司开发上线的ERP系统,数量,金额,成本的计算方式反反复复都修改过好多次,以前都没有对这个业务规则进行计算封装,和统一指定规则,修改就成了一件多而繁琐的的事情了;现在深刻体会这些业务细节将会对业务系统的运行是非常重要的,而业务系统规则的明晰和好的系统业务架构是对其的保证。


  修改过程是一个渐进的过程,希望有过次这方面经验的朋友提提建议,也希望没有注意到这些细节的朋友少走弯路,简单归纳了下,产生错误地方有3个方面:


  最先意识到的是计算精度丢失,主要是这几个原因引起的:


  1、查看后台代码的发现代码里有有变量是用的float或double类型,这样精度在计算的时候就会有精度转换误差,这个比较容易解决,都改为decimal 类型就可以了;


  2、是发现有很多计算的精度丢失是因为使用到中间变量的原因,而在中间变量有保留小数位!现在修改方式第一种方式是中间变量的精度尽可能长,第二方式是直接用原始变量来计算最终结果。


  3、有部分计算是js来计算的,因为js里没有decimal类型的变量,这种常常会产生精度丢失,需要最后ToFix()下保留精度。


  第二方面是存储的数值的精度丢失,是因为数字类型未设置正确, 如设置成float ,double 类型都可能有转换精度丢失,decimal类型没有暂时没有在系统中使用过。也有种情况是中间小数位精度不够长,数值如果用于再次计算的时候,也将出现精度不够的情况。我们现在一般都需要设置数字类型为numerice,数量保留6位小数,显示金额保留2位,计算成本保留8位小数。


  第三方面是显示的问题,在某些特定的地方,需要显示小数位去除多余的0, 一般存在于是报表的显示,和页面显示比较拥挤的地方。在报表里最简便的方法是,利用公式字段去除显示多余的0。


  设置方法如下:


  选择需要格式化的字段, 选“自定义样式”,在“四舍五入”里选择0.0001,然后点“十位”后面的按钮,输入以下公式:



  if Right (ToText ({命令_4.PartNum}, 6), 6) = "000000" then 0 else
  if Right (ToText ({命令_4.PartNum}, 6), 5) = "00000" then 1 else
  if Right (ToText ({命令_4.PartNum}, 6), 4) = "0000" then 2 else
  if Right (ToText ({命令_4.PartNum}, 6), 3) = "000" then 3 else
  if Right (ToText ({命令_4.PartNum}, 6), 2) = "00" then 4 else
  if Right (ToText ({命令_4.PartNum}, 6), 1) = "0" then 5 else 6



添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.