在Windows更新后,一些计算出来的值在最后一位数字上发生了变化,例如从-0.0776529085243926变为了-0.0776529085243925。该变化总是减少了一个数字,并且影响了偶数和奇数。这似乎与KB4486153有关,因为还原此更新会将值更改回先前的值。
在使用Visual Studio进行调试并悬停在变量上时,就可以看到这种变化。该值稍后会被写入输出文件,并且其中的值也会发生更改(而无需运行调试器)。
最小可重现示例
var output = -0.07765290852439255;
Trace.WriteLine(output); // This printout changes with the update.
var dictionary = new Dictionary<int, double>();
dictionary[0] = output; // Hover over dictionary to see the change in debug mode
背景
计算得出的值来自于
output[date] = input[date] / input[previousDate] - 1;
忽略浮点运算中的精度损失,我可以在立即窗口执行计算并得到结果 -0.07765290852439255
,升级前后都是这个值。
然而,当我将鼠标悬停在 output
变量上时,我看到:
{[2011-01-12 00:00:00, -0.0776529085243926]}
升级前{[2011-01-12 00:00:00, -0.0776529085243925]}
升级后并且这种差异也传播到了输出文件中。
看起来计算出的值在更新前后都相同,但其表示方式舍入不同。
输入的值为:
{[2011-01-11 00:00:00, 0.983561000400506]}
{[2011-01-12 00:00:00, 0.907184628008246]}
目标框架已设置为.NET Framework 4.6.1
问题
在保持更新的同时,有没有什么我可以做来恢复以前的行为?
我知道浮点数计算中存在精度损失,但是为什么这种变化会发生在更新之后,我们如何确保未来的更新不改变值的表示方式?
KB4486153是针对Microsoft .NET Framework 4.8的更新,请参见https://support.microsoft.com/en-us/help/4486153/microsoft-net-framework-4-8-on-windows-10-version-1709-windows-10-vers
double v = -0.07765290852439255; Trace.WriteLine(v);
,不是吗? - Ben Voigt