-2

当我运行以下代码时:

public int[] finalResult = new int[dimension];
public float[] calculatedValue = new float[dimension];
.....
.....
finalResult[i] = (int) Math.Floor(calculatedValue[i]);
Console.WriteLine( "calculated:" + calculatedValue[i] 
    +  " final:" + finalResult[i] 
    + "  test: " +(int) Math.Floor(calculatedValue[i]));

输出是:

计算:-0.02043936 最终:0 测试:-1

当它们是从完全相同的代码生成时,为什么“最终”与“测试”不同?哪一个是错的,为什么?

更简单,更小的片段

finalResult[i]=(int)Math.Floor(-3.0002);
Console.WriteLine( "final: "+ finalResult[i]+ " test:" +(int)Math.Floor(-3.0002));

最终输出 :0 测试:-4

其余代码无关紧要,如下证明 我最后尝试了以下内容,

public int[] junkArray = new int[dimension];
junkArray[i]=(int)Math.Floor(-3.0002);  //Junk Array is only assigned here in whole code
Console.WriteLine( "final: "+ (int) junkArray[i]+ " test:" +(int)Math.Floor(-3.0002));

我得到最终输出:0 测试:-4

4

3 回答 3

3

这就是我认为实际发生的事情。请记住,我在这里做出假设,因为您提供的代码无法编译,当我尝试调整它时,我总是得到我期望的正确结果。因此,我试图通过犯一个故意的错误来想办法产生你得到的结果:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        private static int dimension = 1;
        public static int[] junkArray = new int[dimension];

        static void Main(string[] args)
        {
            Method1();
            Method2();
        }

        static void Method1()
        {
            int i = 0;
            junkArray[i] = (int)Math.Floor(-3.0002);
        }

        static void Method2()
        {
            int i = 0;
            int[] junkArray = new int[dimension];
            Console.WriteLine("final: " + (int)junkArray[i] + " test:" + (int)Math.Floor(-3.0002));
        }
    }
}

这会产生您所看到的结果:

最终:0 测试:-4

我将代码分成两种方法,一种方法是“计算”,另一种是“演示”。然而,由于某种原因(缺乏咖啡因,无论如何),我的第二种方法还声明了一个数组变量,该变量隐藏/隐藏了包含我们计算结果的字段。这不是非法的,但这意味着当我在 Console.WriteLine 方法调用中从 junkArray 中读取数据时,我正在从另一个junkArray 中读取与我之前将结果写入的那个不同的 junkArray。

这可能不是正在发生的事情,但这是一种可能性,并且在没有看到您的实际代码的情况下,这是我能提供的最佳猜测。看看并确保您正在读取的数组绝对是您将结果写入的数组,而不是第二个数组“遮蔽”第一个数组。

于 2012-10-02T16:04:05.087 回答
2

如果我测试代码

var final = new int[1];
var calc = new[] { -0.02043936f };
final[0] = (int)Math.Floor(calc[0]);

Console.WriteLine(
    "calc:{0} final:{1} test:{2}",
    calc[0],
    final[0],
    (int)Math.Floor(calc[0]));

不出所料,我得到了输出

计算:-0.02043936 最终:-1 测试:-1

因此,您的代码还有其他问题。

于 2012-10-02T15:15:53.257 回答
0

这里发生了两件事

首先 - -0.02043936 是计算值

现在你正在应用 math.floor 。它将做的是,它将降低价值并返回一个双倍,这将再次是一个非常小的数字。

现在您将其转换为整数。这样做时,因为它更接近于零,所以它会变成零。

为了证明这一点,将计算值设为 -0.62043936 或类似的值,您将得到 -1 符合您的期望

于 2012-10-02T15:11:32.033 回答