我承担了将一个非常古老的经典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)
变成这是C#
var newVal = Math.Round(boundData.Value * 3.0689,3);
我没有将任何内容转换为double或decimal,只是在数据库出来时使用它。我必须使用.Value,因为否则我不能乘以Double?和双人。
这些值非常接近,但在一个非常重要的数据上偏差约为0.036,我找不到任何理由。
答案 0 :(得分:6)
事实上,both .NET和VB use the Banker's Rounding algorithm,只要您没有指定MidpointRounding.AwayFromZero,就应该获得一致的结果。
真正有趣的问题是Access数据库中的源数据是浮点数还是货币列。如果它是货币,那么你应该使用小数,而不是双数。如果被倍增的数字的大小充分不同,那么这可能会导致细微差别。
对于特别重要的数据,boundData的值是什么?