数学.Round根据运行的位置产生不同的结果

本文关键字:结果 位置 运行 数学 Round | 更新日期: 2023-09-27 18:05:44

下面这行代码产生了两个不同的结果。

给定以下行

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

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

关于为什么它会产生不同的值或如何使其行为一致的任何想法?

使用visual studio 2013在64位机器上运行

数学.Round根据运行的位置产生不同的结果

很多年前我也有过类似的问题。一段时间后,我的应用程序计算双精度值与一个精度和一段时间后-与另一个精度。这是非常奇怪的。

经过一段时间后,我发现在某些时候应用程序初始化DirectX默认标志和DX反过来改变FPU精度与双值。

所以,作为一个建议,请检查相邻的代码是否有副作用。(检查DirectX使用情况,检查外部非托管dll使用情况)

PS:没有魔法。不要混淆。并尝试推迟十进制的使用。

似乎控制台和测试运行程序使用不同的首选方法来舍入。

这应该会给你相同的结果:

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

可以用double来代替float

精度不够