舍入浮点值

Rounding Floating point Values

本文关键字:舍入      更新时间:2023-10-16

我的任务是将c++代码移植到c#。客户在我的代码中报告了一个bug。当我进行调试时,得到的结果如下:

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()的重载,不知道如何获得相同的结果。

c++版本给出的答案是完全错误的。这应该是显而易见的。很明显,2E-12是正确答案,因为SimpleRoundToMath.Round一样,四舍五入。

所以,如果你想在c#中重现c++版本的错误输出,你需要将Delphi RTL代码翻译成c#。这将涉及计算出SimpleRoundToString()转换的确切作用。或p/invoke到c++ DLL。

我将通过尝试找出原始代码想要做什么来解决这个问题。用数学的方式来表达,而不是用RTL函数来表达。一旦你有了一个明确的规范,说明你想要代码做什么,使用自然的c#机制在c#中进行编码。换句话说,不要尝试逐字翻译,因为可能根本不存在直译。相反,理解原始代码的意图并在c#中从头开始实现它。

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