Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换为双(十进制)结果不一致_C# - Fatal编程技术网

C# 转换为双(十进制)结果不一致

C# 转换为双(十进制)结果不一致,c#,C#,我升级了一个计算程序,发现结果出乎意料地发生了变化。 我已经找到了问题所在,但不知道这是如何发生的,也不知道如何解决 结果差异是由该语句引起的 Convert.ToDouble(0.0000000035141287671294348266M) 当我打开两个Visual Studio Community 2015实例来运行新程序和旧程序时,在语句之前设置一个断点并在即时窗口中对其求值,我可以得到两个结果。 一是 另一个是 3.5141287671294345E-09 前者似乎是正确的(4348

我升级了一个计算程序,发现结果出乎意料地发生了变化。 我已经找到了问题所在,但不知道这是如何发生的,也不知道如何解决

结果差异是由该语句引起的

Convert.ToDouble(0.0000000035141287671294348266M)
当我打开两个Visual Studio Community 2015实例来运行新程序和旧程序时,在语句之前设置一个断点并在即时窗口中对其求值,我可以得到两个结果。 一是

另一个是

3.5141287671294345E-09
前者似乎是正确的(4348266四舍五入为435),但如果我在前一个程序启动后立即中断它并再次求值,结果将变成后者


虽然差别不大,但这种行为让我害怕。哪一个应该是正确的结果?如何避免这个问题?

问题在于双精度的保证精度


根据您的示例,它是15-16位,差异仅在第16位可见。

当您说“升级”时,您的意思是什么?这两个版本之间发生了什么变化?UI、重构等。很多都发生了变化。旧程序在VS2010中开发,并在VS2015中重新编译。使用相同的.NET framework 4.0。VS版本与实际运行时和提供的库无关。如果.NET framework版本没有更改,则不会对实现产生任何影响。通常,当您将
十进制
截断为
双精度
时,您会失去精度,这正是为什么您应该使用
十进制
,如果这对您很重要的话。如果不能保证第16位的精度,您就不能对其进行任何假设。不,当您将数字表示为双精度时,它可以以各种方式表示,因此在谈到精度时,您无法确保相同的操作可以提供完全相同的值。这些值可以很接近,但最后一个值的表示形式并不总是相同的digits@lya这正是未定义行为的问题,它是未定义的。是的,我以前检查过这个MSDN页面。但是,对于同一个语句,它不应该在同一版本的VS中给出相同的结果吗?不管精度是多少?正如所说,精度是15或16位。在一种情况下,它是15位(最后正确舍入到435位),在另一种情况下,它是16位(最后舍入到4345位)。因此,可以安全地假设,永远不要期望精度超过15位双精度数字。
3.5141287671294345E-09