Math.Round根据其运行位置产生不同的结果

时间:2015-07-31 01:40:14

标签: c# .net

我有以下代码行生成2个不同的结果。

给出以下一行

var rounded = Math.Round(415 * 0.01f, 1);

我希望这一直到4.2。当我从控制台应用程序运行它时,我总是得到预期的结果4.2。如果我在单元测试中放入相同的行并运行该测试,我最终会得到4.1。如果该行在Windows服务中运行,我最终也会得到4.1。

有关为何会产生不同价值或如何使其表现一致的任何想法?

使用Visual Studio 2013在装有.NET 4.5的64位计算机上运行。

3 个答案:

答案 0 :(得分:0)

很多年前我遇到过类似的问题。一段时间后,我的应用程序计算了一个精度的双值,并在一段时间后 - 另一个精度。这非常奇怪。

经过一段时间后,我发现应用程序在某些时候使用默认标志初始化DirectX,然后DX会将FPU精度更改为双倍值。

因此,作为建议,请检查相邻代码的副作用。 (检查DirectX用法,检查外部非托管DLL的使用情况)

PS:没有魔法。不要混淆。并尝试使用Decimal使用。这是OLE的最慢的事情......

答案 1 :(得分:0)

控制台和测试运行器似乎使用了不同的首选取整方法。

这应该给您相同的结果:

using Microsoft.EntityFrameworkCore;

答案 2 :(得分:-1)

var rounded = Math.Round(415 * 0.01d, 1);

你可以用double来代替float

准确性不够