舍入浮点值

时间:2014-07-03 06:31:08

标签: c# c++ delphi floating-point

我的任务是将C ++代码移植到C#。客户端在我的代码中报告了一个错误。当我做调试时,这就是我得到的......

C ++代码:

double d = -0.0000000000018736038338473693;
String temp = String(SimpleRoundTo(d, -12))); // SimpleRoundTo() is from delphi
// temp is having -1E-12

C#代码:

double d = -0.0000000000018736038338473693;
string temp = (Math.Round(d, 12)).ToString();
// temp is having -2E-12

我确实通过Math.Round()检查了重载,但没有得到如何得到相同的结果。

1 个答案:

答案 0 :(得分:4)

C ++版本给出的答案是完全错误的。这应该是显而易见的。很明显2E-12SimpleRoundTo以来的正确答案,就像Math.Round一样,舍入到最近。

因此,如果您希望在C#中重现C ++版本的错误输出,则需要将Delphi RTL代码转换为C#。这将涉及确切地计算SimpleRoundToString()转换的作用。或者p /调用C ++ DLL。

我会通过尝试找出原始代码预期来做到这一点来解决这个问题。以数学方式而不是RTL函数表达这一点。一旦明确规定了代码的用途,就可以使用自然的C#机制在C#中对其进行编码。换句话说,不要尝试直译,因为可能不存在。而是理解原始代码的意图,并在C#中从头开始实现它。

查看代码,执行舍入,然后转换为文本。我会寻找一种方法,将转换作为转换为文本的一部分。