3

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

只是为了全面披露,我将 Access 数据库毫无问题地导入 SQL Server。我使用 EntityFramewok PowerTools(代码优先)对新数据库进行逆向工程并创建我的 .edmx 文件。我注意到,当 EntityFramework 为我创建 .edmx 时,它在 C# 类中将数据库中浮动的字段定义为可为空的 Doubles(Double?)...是否存在任何转置、截断或更改值的风险将float转换为可为空的double时的方式?

我认为值得怀疑的另一个地方是四舍五入。显然,四舍五入的数学并没有改变,但我想知道 VBScript 和 C# 在如何四舍五入方面是否有任何已知差异。

所以VBScript中的这些行

varA1=oDataRs("boundData")
varB1i=varA1*3.0689
varB1=round(varB1i,3)

变成这是 C#

var newVal = Math.Round(boundData.Value * 3.0689,3);

我没有将任何东西转换为双精度或十进制,只是在它从数据库中出来时使用它。我必须使用 .Value 否则我不能乘以 Double?和双。

这些值非常接近,但在一个非常重要的数据上相差约 0.036,我找不到任何原因。

4

1 回答 1

6

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

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

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

于 2012-11-30T21:39:51.050 回答