有符号整数数组类型转换C#

有符号整数数组类型转换C#,c#,arrays,casting,int,signed,C#,Arrays,Casting,Int,Signed,当我运行以下代码时: 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:

当我运行以下代码时:

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

当“final”和“test”由完全相同的代码生成时,为什么它们不同?哪一个是错的,为什么

更简单,更小的片段

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

这里发生了两件事

首先--0.02043936是一个计算值

现在您正在应用math.floor。它将做的是,它将把值降到最低,并返回一个double,这个double将再次是一个非常小的数字

现在将其转换为整数。这样做的时候,由于它更接近于零,它会变成零

为了证明这一点,将计算值设为-0.62043936或类似值,如果我测试代码,您将根据您的期望得到-1

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


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

以下是我认为实际发生的情况。请记住,我在这里做假设,因为您提供的代码不可编译,当我尝试调整它时,我总是得到我期望的正确结果。因此,我试图通过故意犯错误来产生结果:

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

我将代码分为两种方法,一种是“计算”,另一种是“表示”。然而,出于某种原因(不管怎样,缺少咖啡因),我的第二个方法也声明了一个数组变量,它隐藏/隐藏了包含计算结果的字段。这并不违法,但这意味着当我在控制台中读取junkArray.WriteLine方法调用时,我读取的是另一个junkArray,与我之前写入结果的junkArray不同


这可能不是正在发生的事情,但这是一种可能性,在没有看到您的实际代码的情况下,这是我能提供的最佳猜测。看一看,绝对确保你正在读取的数组与你在其中写入结果的数组完全相同,而不是第二个数组“隐藏”第一个数组。

@Servy我假设这是
-0.02043936
,但我不确定数组与问题的相关性。当我添加类似“finalResult[I] = -9; ' 在finalResult[i]和Console.Writeline(“计算:”)之间,输出给我final=-9(这是正确的),所以我认为省略的代码是不相关的。请尝试将
finalResult[I]
赋值移动到
控制台内。WriteLine()
,看看您得到了什么。请您发布一个完整的代码片段,我们可以运行它来演示这个问题。我试图复制你的结果,但我不能。另外,您使用的是什么版本的.NET?建议:请将实际程序中对应于“junkArray[i]=(int)Math.Floor(-3.0002);”的行更改为“junkArray[i]=7”,然后运行您的程序。如果输出列表为“final:7”,那么您确实在给定的平台和框架版本上发现了Math.Floor的一些模糊错误。但是,如果输出仍然列出“final:0”,那么您在其他地方做了一些错误,您需要向我们展示更多代码,然后我们才能提供帮助。调用值为-0.02043936的Floor()将返回一个double,是的,但该double应为-1。将其转换为int,则应生成-1。我想你可能把地板和圆角混淆了。你说得对,msdn上也给出了同样的事实-。但我认为你应该试试我的建议。这真是一个有趣的问题。所以你刚才争论了为什么
(int)Math.Floor(calculatedValue[i])
应该返回零,那么
test
-1为什么呢?不,不是这样,你的观察是完全正确的,问题是,这个问题最可疑的部分是转换为int。如果不是罪魁祸首,也许我们需要更深入地挖掘代码来找出原因。我知道-0.02的地板。。。应该是-1。我进一步建议使用double而不是float。将计算值数组设置为double类型。这应该会有所不同。我同意,我编写了类似的测试用例代码,也不能重现提问者的结果。对于提供的示例,我分别获得了“calc:-0.02043936最终:-1测试:-1”和“calc:-3.0002最终:-4测试:-4”的输出。好的,你能看看我上次编辑的地方吗,我把junkArray放在那里。显然,如果代码中有任何错误,那一定是在这三行中,如果不是其他的话。在上次编辑中没有任何不同。我不能在不修改它的情况下测试它,因为您发布的不是一个可编译的程序-它不是一个方法体,因为您在那里有一个公共字段声明,并且给定的代码没有声明或初始化维度或I。因此,从该示例中可以收集到的信息很少,因此,您是否可以组合一个实际完整且可运行的测试用例供我们查看?这两行不可能在一起。第一行是字段声明,它在类级别是合法的,但不在方法/属性内部。第二行是一个赋值,它在类级别上是不合法的,但在方法/属性中是合法的。因此,这两行代码来自不同的地方,您正在提取代码片段来向我们展示。问题是,你的错误很可能是从你还没有给我们看的那句话中潜入的。请看我对这个问题本身的最新评论。让我们完全排除Math.Floor,只需指定一个已知值,如7,然后查看打印出的结果。如果是7,那么您在平台/框架上发现了Math.Floor的一个奇怪且模糊的bug。如果它是0,那么它与数学无关。地板和你在其他地方做错了什么。你可以,比如说,hav