如何使C+中的结果相同+;和双值的C#

如何使C+中的结果相同+;和双值的C#,c#,c++,precision,C#,C++,Precision,请注意,我不是在问为什么一个双精度值会变为另一个精度,而是如何使结果相同 我很感激下面所有的评论和回答,但我没有找到解决问题的方法 我的问题又来了 p>我在重写双值精度问题时,遇到了一个问题,从C++到c 我有一个计算两个值的金融产品的结果的方法,但是当我比较结果时,由于双值的精度,我从C++和C程序中得到了不同但类似的结果。 我在C++中调试程序,发现在将值设置为A和B之后 双a=4.9 double b=5.1 a和b的值变为,a为4.900000000000004,b为5.0999999

请注意,我不是在问为什么一个双精度值会变为另一个精度,而是如何使结果相同

我很感激下面所有的评论和回答,但我没有找到解决问题的方法

我的问题又来了

<> p>我在重写双值精度问题时,遇到了一个问题,从C++到c

我有一个计算两个值的金融产品的结果的方法,但是当我比较结果时,由于双值的精度,我从C++和C程序中得到了不同但类似的结果。 <>我在C++中调试程序,发现在将值设置为A和B之后

双a=4.9
double b=5.1

a和b的值变为,a为4.900000000000004,b为5.099999996。 但是在C#中,a仍然是4.9,b仍然是5.1,最后,我得到了
-0.06257963092171816
(C++result)和
-0.062579644244387111
(C#result)的结果

<>我在C和C++中完全陌生,所以有没有解决方案使计算结果相同?(我不能改变C++代码)? 还是可以使计算结果相同?

这是一个显示问题-实际值是你所期望的,并且与C++代码匹配。尝试此代码查看存储的近似值1:

double a = 4.9; double b = 5.1;
Console.WriteLine(a.ToString("G20"));
Console.WriteLine(b.ToString("G20"));
结果是:

4.900000000000004

5.099999996

有关使用G20的原因以及其他数字格式字符串是什么的详细信息,请参阅



我说近似值是因为计算机只能存储由
1/pow(2,n)
组成的分数。例如,0.75是1/2+1/4,因此可以准确表示。同样,我们不能准确地表示以10为基数的1/3(我们可以写0.3、0.33、0.333、0.3333等),你也不能用2为基数的分数(二进制),因为它们不能由2的幂组成。有关这方面的更多信息,请参阅。

简短回答,可能是因为编译器优化

严格遵循IEEE浮点规范将产生完全相同的结果。但编译器常常做出牺牲正确性以换取速度的决定。对代码应用代数重排,将多个操作融合在一起,各种优化都会改变结果


大多数C编译器都提供编译器标志,允许您调整允许哪些优化。我不知道C是否提供了任何明确的保证。

@Arphile为什么
float
?这是否回答了你的问题?如果我们看不到把你带到那里的计算和过程,我们能提供的最好的方法就是平淡的概括。你可能会无意中发现这两种语言之间的细微差别,它超越了浮点数的不精确性,但你没有办法知道。建议:让我们称之为。一个小程序,在本例中是两个,它用尽可能少的附加绒毛来演示问题。除非问题非常非常微妙,并且需要非常详细的重现,否则MRE看起来与您需要保护的代码完全不同,以防被窥探。在与我的团队负责人讨论后,我被告知可以将它们视为小数点后3位的相同结果。问题结束了。谢谢你的回答,但我仍然不知道结果不一样的原因。结果是一样的,但是当转换成字符串时,结果是不同的。所以我的意思是,即使结果为
-0.06257964424438711
-0.06257963092710816
也可视为相同的结果??取决于预期的精度,可能是。在完全精确的情况下,不是。它们是不同的结果。