.net Math.Round打印后的奇怪行为

时间:2014-04-03 14:32:48

标签: c# .net

这个问题既不是笑话也不是垃圾邮件。在HP OfficeJet Pro 8600上打印后,我们注意到了Math.Round的奇怪行为。这在.net 2.0和.net 4.0中都可以看到。

此代码可以重现此问题。

double test = 1265.26777777;
MessageBox.Show("decimal : "+Math.Round(Convert.ToDecimal(test),2).ToString()+
         " -- "+"double : "+Math.Round(test,2).ToString());

显示的结果是1265.27-1265.27 - >行

我们将一些副本打印到HP打印机(2或3个打印作业)

结果现在是1265.27 - 1265.26

这个1美分的差异可以用任何测试值复制。

有人对这种行为有一个合理解释的开始吗?

提前感谢您的帮助。

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:4)

以下是解决方案:

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]        
public static extern int _fpreset();

并在打印后调用_fpreset()解决了这个问题。

  

Hans Passant:这将重置浮点处理器。

这是正确的方法!有关_fpreset的信息,请参阅here

感谢大家的成功集思广益。