1

检查一下:这个小的 .NET 控制台程序产生了有趣的结果......请注意我如何以两种不同的方式将浮点数转换为整数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CastVsConvert
{
    class Program
    {
        static void Main(string[] args)
        {
            int newWidth = 0;
            CalculateResizeSizes(600, 500, out newWidth);
        }

        static void CalculateResizeSizes(int originalWidth, int maxWidth, out int newWidth)
        {
            float percentage = 1.0F;
            percentage = maxWidth / (float)originalWidth;

            newWidth = (int)((float)originalWidth * percentage);
            int newWidthConvert = Convert.ToInt32((float)originalWidth * percentage);

            Console.Write("Percentage: {0}\n", percentage.ToString());
            Console.Write("Cast: {0}\n", newWidth.ToString());
            Console.Write("Convert: {0}\n", newWidthConvert.ToString());
        }
    }
}

我希望“Cast”和“Convert”的输出是相同的,但它们不是......这是输出:

C:\Documents and Settings\Scott\My Documents\Visual Studio 2008\Projects\CastVsC
onvert\CastVsConvert\bin\Debug>CastVsConvert.exe
Percentage: 0.8333333
Cast: 499
Convert: 500

有人知道为什么.NET 在这里返回不同的值吗?

4

4 回答 4

14

它不是错误,cast截断,convert回合。

看到这个

于 2008-11-03T20:49:20.857 回答
5

转换是四舍五入时,演员会切掉小数点后的数字部分。

于 2008-11-03T20:48:59.720 回答
5

来自Convert.ToInt32返回值的文档:

四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转换为4,5.5转换为6。

铸造不会四舍五入 - 它只是截断。乘法的结果略低于 500,因此强制转换会将其截断为 499,而 Convert.ToInt32 会将其四舍五入为 500。

于 2008-11-03T20:49:42.963 回答
1

有一个额外的隐藏演员可能导致了这种情况。例如,如果您使用它而不是重新计算:

int newWidthConvert = Convert.ToInt32(newWidth);

你会得到同样的结果。当您使用 Reflector 查看时,发生的事情会变得更加清晰Convert.ToInt32(float)

public static int ToInt32(float value)
{
    return ToInt32((double) value);
}

有一个隐藏的演员表Double

如果您添加几行进行调查,然后使用调试器进行查看,您将看到会发生什么:

float newWidth1 = ((float)originalWidth * percentage);
double newWidth2 = ((float)originalWidth * percentage); 

double更精确,并将值保存为 499.999999 和更多的十进制数字。 float不太精确并存储 500.0。整数转换会截断小数部分,因此根据中间转换得到 500 或 499。当你调用Convert.ToInt32()时,结果已经被转换为 a float,所以你得到Double500.0 的表示。就我个人而言,我更喜欢总是尽可能地使用double

于 2008-11-03T20:59:04.457 回答