U9 研发体系精度开发说明 文 件 编 号 :U9-研发-精度开发 版 本 号 :V1.5 修 改 状 态 : 编 写 人 :刘伟 审 核 人 : 批 准 人 : 批 准 时 间 :2008.06.30 版本记录 版本 修改与参与人 修改时间 修改原因 修改概述 审核人1.5 刘伟 2008-06-30 原始文档建立 1.5 刘伟 2008-08-15 复查不通过,修改 1. 提供源代码rar文件 2. 提供通用CRUD实现的列表精度如何在设计态绑定 3. 文档请按规范格式书写 一.问题域说明 精度舍入是指 U9 的十进制数据类型的控件基本上都需要精度舍入的应用.例如金额和单价需要绑定币符,精度(小数位),舍入值,舍入类型,汇率需要绑定精度等等 二.基本原理 Decimal 数据结构 U9 内所有的数字精度基本上都是由 decimal 实现的。汇率精度,单价精度,金额精度,单位精度等等。所以,有必要介绍下 decimal 的数据结构。 private Decimal(int lo, int mid, int hi, int flags) { this.lo = lo; this.mid = mid; this.hi = hi; this.flags = flags; } Decimal 数字的二进制表示由 1 位符号、一个 96 位的整数以及一个比例因子组成,比例因子用以分隔该整数以指定它的哪一部分为小数部分。比例因子隐式地定为数字 10 的幂,指数范围从 0 到 28。那么很明显,lo,mid,hi 就是分别对应 96 位整数的低 32 位、中间 32 位和高 32 位.而 flags 则是比例因子和符号了。 Flags 的数据结构: 0 到 15 位(即字的低位部分)不被使用且必须为零。 16 到 23 位必须包含一个 0 到 28 之间的指数,指示 10 的幂,用以分隔该整数。 24 到 30 位不被使用且必须为零。 31 位包含符号,0 表示正,1 表示负。 所有无论 decimal 如何变化,只要清晰的明白了他的内部数据结构,就可以为所欲为的操作精度了。 U9 精度开发 U9 的默认精度是 9 位。 U9 的精度是通过一个属性类型(UFIDA.U9.Base.PropertyTypes.Round[UFIDA.U9.Base.BaseBE.dll])实现的。 public int Precision { get; set; } public RoundTypeEnum RoundType { get; set; } public int RoundValue { get; set; } Precision 是精度,U9 所有的类型的精度都是默认 9 位。 RoundType 是舍入类型,目前只有按值舍入, 全部进位, 全部舍位这三种。 RoundValue 是舍入值。 Round内有一个方法public decimal GetRoundValue(decimal amount)可以直接格式化数字精度及其舍入。当然这个方法只适用于后台。至于前台可以直接使用UFIDA.U9.CBO.UIHelper.RoundHelper[UFIDA.U9.CBO.UIHelper.dll]中的public decimal GetRoundValue(decimal amount); 三.关键代码及说明 汇率精度 汇率没有符号和舍入值舍入类型,只有精度。 汇率的精度存储在汇率表中,一般通过调用BaseBP中的GetDateExchangeRateDTO可以取得当天的汇率及其汇率精度。 由于汇率精度不会随单据或档案持久化到数据库内,所有在数据加载的时候,必须重新取得汇率精度。 在 ActionExtend.cs 中的 OnLoadData_Extend 方法后添加如下一段: //调用根据日期取得汇率精度 DTO 的 BP GetDateExchangeRateDTOProxy bp = new GetDateExchangeRateDTOProxy(); //核算币种 bp.FromCurrency = head.AC; //本币 bp.ToCurrency = head.FC; //日期 bp.Date = head.AccrueDate; //汇率类型 bp.ExchangeRateType = head.ACToFCERType??0; //汇率精度DTO ExchangeRateDTOData rateData = bp.Do(); //取得汇率精度 head.RatePrecision = rateData.RatePrecision; 注意:在网格(Grid)、列表、查询及报表出现的汇率精度,则需要自己添加一个批量取得汇率精度的BP,当然也可以使用UFIDA.CBO.SCM.Proxy.GetDateExchangeRatesProxy这个BP. 货币精度 货币的精度都是存于币种(Currency)上的,汇率实体上有 2 个精度属性,一个单价精度,一个金额精度. 一般后台不需要对单价和金额做特别的处理,只要直接调用 Currency 上的 Round 属性内的方法GetR...