【问题标题】:XBase Language Rounding WeirdnessXBase 语言舍入怪异
【发布时间】:2012-11-30 20:53:46
【问题描述】:

我需要采用XBase-style 语言(在本例中为 FoxPro)中的遗留代码并将其转换为 C#.NET。我想从我的重写中得到相同的输出,但是四舍五入的差异让我抓狂。我单独尝试了 Decimal.Round(MidpointRounding) 东西,但发现我还需要为 midpoint = 5 情况编写自己的“向上取整”函数。

如果它有效,那很好,但我看到的是,在某些情况下需要我的“汇总”方法才能与 FoxPro 输出一致,但实际上会在其他情况下产生差异。数据库查询正在做一些乘法和除法,我想知道两个系统之间的数学差异是否正在累积。

这是一个在我看来不一致的例子。每对的初始值来自我的 LINQ 查询的输出。鉴于这些,我想生成与所示 FoxPro 结果相同的舍入结果:

.NET LINQ Query result: 7.0477049103806673503597572093.
FoxPro rounding: 7.0

.NET LINQ: 7.2499596595318807183725770943.
FoxPro rounding: 7.3

关于如何在不采用完全笨拙的黑客攻击的情况下准确复制遗留系统的价值的任何建议?

【问题讨论】:

  • 您使用的是哪个版本的 Foxpro。我在 VFP 中尝试了你的 LINQ 结果,它作为一个变量(未指定的显式类型)、作为一个硬数字通过 round(7.2499....、1)和作为强类型小数,正确地向下舍入到 7.2,设置变量到 7.2499... -- (全长),它们都四舍五入到 7.2

标签: .net decimal rounding visual-foxpro


【解决方案1】:

您的问题可能与浮点精度有关。在 FoxPro 程序循环之前,它将值存储在什么类型的变量中?你用什么类型的?

如果 FoxPro 程序使用的浮点数比您在 C# 中使用的精度低(反之亦然),这可能是您看到的差异的原因。

【讨论】:

  • 请看我上面修改过的问题。我并没有完全坦白,因为我没有提到正在进行的数学运算,所以我不能说这轮的输入在 FoxPro 中是完全相同的。在回答您的问题时,我在.NET 中使用十进制类型。 FoxPro 代码没有明确的类型声明。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多