C#Math.Round和Nullable Doubles

har*_*a11 3 c# sql vbscript ms-access

我承担了将一个非常古老的经典ASP/VBScript/Access网站转换为"当前"网站的任务.正如您所怀疑的那样,大部分内容都比较简单,但是有一个报告页面依赖于一堆未记录的计算,所以我只需要使用他的代码/公式,但将它们移到C# .

只是为了完全公开,我将Access数据库导入SQL Server没有任何问题.我使用EntityFramewok PowerTools(Code First)对新数据库进行反向工程并创建我的.edmx文件.我注意到当EntityFramework为我创建了.edmx时,它将数据库中浮动的字段定义为C#类中可空的双打(Double?)...是否有任何转置,斩波或更改任何值的风险将float转换为nullable double时的方法?

我认为可疑的另一个方面是四舍五入.显然围绕舍入的数学没有改变,但我想知道VBScript和C#在它们如何回合中有任何已知的差异.

所以这些行在VBScript中

varA1=oDataRs("boundData")
varB1i=varA1*3.0689
varB1=round(varB1i,3)
Run Code Online (Sandbox Code Playgroud)

变成这是C#

var newVal = Math.Round(boundData.Value * 3.0689,3);
Run Code Online (Sandbox Code Playgroud)

我没有将任何东西转换为double或decimal,只是在数据库出来时使用它.我必须使用.Value,因为否则我不能乘以Double?和一个双.

这些值非常接近,但在相当重要的数据上偏差约为0.036,我找不到任何理由.

Rob*_*Rob 6

事实上,.NETVB都使用Banker的Rounding算法,因此只要不指定MidpointRounding.AwayFromZero,就应该得到一致的结果.

真正有趣的问题是Access数据库中的源数据是浮点数还是货币列.如果它是货币,那么你应该使用小数,而不是双数.如果被倍增的数字的大小足够不同,那么这可能会导致小的差异.

对于特别重要的数据,boundData的值是多少?

  • 在Access表设计视图中,"Number"更多是数据类型*category*.进一步查看"字段属性"部分的"常规"选项卡.在"字段大小"选择框中查找特定类型(字节,整数,长整数,单,双等). (2认同)