挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
游戏交易就上寄售网-专注稳定-诚信赢天下玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)天下盾/国内/免实名/免备案CDN无视一切CC/DD攻击 找塔科夫作者TG @wuhao1954 QQ283931494 →入驻S9企业发卡网各种全黑号辅助群:475351077
██【我要租此广告位】██... .
查看: 2953|回复: 1
打印 上一主题 下一主题

.Net业务平台的数值精度陷阱与解决方法总结

[复制链接]

205

积分

66

主题

0

听众
已帮网友解决0 个问题
好评
0
贡献
139
海币
389
交易币
0
跳转到指定楼层
楼主
发表于 2015-12-9 10:56:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


今天小编带领大家一起学习有关编程语言的知识,让我们一起感受知识的力量

本文主要介绍一下.Net业务平台的数值精度陷阱与解决方法。
最近公司的实施人员反映,数量小数位保留3位精度不够,需要保留6位才行,回想起这个问题,公司开发上线的系统,数量,金额,成本的计算方式反反复复都修改过好多次,以前都没有对这个业务规则进行计算封装,和统一指定规则,修改就成了一件多而繁琐的的事情了;现在深刻体会这些业务细节将会对业务系统的运行是非常重要的,而业务系统规则的明晰和好的系统业务架构是对其的保证。
修改过程是一个渐进的过程,希望有过次这方面经验的朋友提提建议,也希望没有注意到这些细节的朋友少走弯路,简单归纳了下,产生错误地方有3个方面:
最先意识到的是计算精度丢失,主要是这几个原因引起的:
1、查看后台代码的发现代码里有有变量是用的float或double类型,这样精度在计算的时候就会有精度转换误差,这个比较容易解决,都改为decimal 类型就可以了;
2、是发现有很多计算的精度丢失是因为使用到中间变量的原因,而在中间变量有保留小数位!现在修改方式第一种方式是中间变量的精度尽可能长,第二方式是直接用原始变量来计算最终结果。
3、有部分计算是js来计算的,因为js里没有decimal类型的变量,这种常常会产生精度丢失,需要最后ToFix()下保留精度。
第二方面是存储的数值的精度丢失,是因为数字类型未设置正确, 如设置成float ,double 类型都可能有转换精度丢失,decimal类型没有暂时没有在系统中使用过。也有种情况是中间小数位精度不够长,数值如果用于再次计算的时候,也将出现精度不够的情况。我们现在一般都需要设置数字类型为numerice,数量保留6位小数,显示金额保留2位,计算成本保留8位小数。
第三方面是显示的问题,在某些特定的地方,需要显示小数位去除多余的0, 一般存在于是报表的显示,和页面显示比较拥挤的地方。在报表里最简便的方法是,利用公式字段去除显示多余的0。
设置方法如下:
选择需要格式化的字段, 选“自定义样式”,在“四舍五入”里选择0.0001,然后点“十位”后面的按钮,输入以下公式:

在过去三年中 XML 经历了许多反复,所以目前存在不同版本的 Microsoft XML 分析器也不奇怪。Internet Explorer 4.0 包含早期版本的 XML 分析器,它比 XSL、XML 数据或者大多数其他的 XML 技术(并且有完全不同的 DOM 模型)要早。该早期版本的分析器包含在 MSXML.dll 库中。从 MSDN XML 开发人员中心(英文)可将分析器升级到较新的一种。
  我们极力建议您升级到新的分析器,因为它要强大得多。Internet Explorer 5.0 包括 MSXML 2.0 分析器,它包含 XSL 和 XML 架构的基本版本。MSXML2 是 SQL Server 2000 附带的分析器版本。MSXML2 包含了许多性能增强的功能,并且在总体上提高了性能和可伸缩性。MSXML3 是当前作为“技术预览”附带的版本。MSXML3 包括 XSLT 和 XPath 支持以及 SAX 接口。


在网站维护中,站长朋友常常要对网站数据进行备份,以免出现意外情况而造成数据的损失。一般的下载备份方法不仅麻烦而且速度缓慢。这时我们就可以使用程序提供的文件压缩功能来快速进行网站数据的备份。

C语言视频教程以下为引用的内容:
  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


可以实现数字保留6位精度,如果数值有0 的地方自动去除掉多余的0
设置步骤如下图(里面公式稍稍有不一样,但是都可以实现结果):


也可以用修改Sql的方式去除多余的小数位0。

以下为引用的内容:
  SELECT
  col,
  col_convert = CASE
  WHEN CHARINDEX('.', col) = 0
  THEN col
  WHEN RIGHT(col, PATINDEX('%[^0]%', REVERSE(col))) LIKE '.%'
  THEN LEFT(col, LEN(col) - PATINDEX('%[^0]%', REVERSE(col)))
  ELSE LEFT(col, LEN(col) - PATINDEX('%[^0]%', REVERSE(col)) + 1)
  END
  FROM(
  SELECT col = '100' UNION ALL
  SELECT col = NULL UNION ALL
  SELECT col = '.100' UNION ALL
  SELECT col = '.100100' UNION ALL
  SELECT col = '0.' UNION ALL
  SELECT col = '0' UNION ALL
  SELECT col = '100.1010' UNION ALL
  SELECT col = '100.0000'
  )A


C语言教程可以简单对这个sql封装成函数来实现;
最后还值得注意的有3点:
1、很多数值不正确是因为计算公式或逻辑不明确引起的,有些代码是没有真正理解清楚就开始在开发了;ERP系统的开发对业务的逻辑理解是非常重要的;
2、后台显示去除0的方法也有一种是,在程序里直接double.Parse()下就可以去除掉小数位多余的0,再ToString()为字符显示,double类型有个问题,如果数字为连续的5位小数0,就会显示为自动缩变为科学计算法,如果是后台显示的地方,可以先double.parse()下,转为string,再转为decimal类型就会去除掉多余的小数位0了。
3、最先我们把数量保留3位精度,金额保留2位,和成本保留4精度,后来发现实际业务计算的时候是不够的,应该早考虑这方面的业务规则定义和计算,可以使用或类似的工具来早与客户,架构师,程序员,测试员之间沟通;

文章看完啦是不是意犹未尽,更多视频教程尽在课课家官方网站,让我们一起沉浸在知识的海洋。



联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:介绍.net打包自动安装数据库
下一篇:数据结构与算法分析(C#版):学习数据结构的东东
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:[email protected]),本站将立即改正。

1

积分

0

主题

1

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
6
交易币
0
沙发
发表于 2015-12-9 15:42:27 | 只看该作者
比较牛B,虽然我没看懂。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2024-5-7 02:53 , Processed in 0.553688 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表