将double转换为int将返回意外结果

时间:2017-02-17 20:42:20

标签: c# int type-conversion double decimal

我想将double转换为int。但我很困惑。这是我的代码。

private void tbxDouble_TextChanged(object sender, EventArgs e)
{
    tbxInt.Text = Convert.ToDouble(tbxDouble.Text).ToString("F0");
    tbxInt2.Text = Math.Round(Convert.ToDouble(tbxDouble.Text),0).ToString();
}

100,5 =>的结果 101和 100

100,56 =>的结果 101和 101

100,49 =>的结果 100和 100

为什么所有结果都不是101?这有什么问题?

3 个答案:

答案 0 :(得分:7)

编辑:正如在评论中指出的那样 - 当我写“F0”格式化只会截断数字时,我的初步答案是错误的。正确的答案是它会圆,但它会使用其他类型的舍入称为“远离零”四舍五入。

我认为100,49和100,56的案例是显而易见的,所以让我们来看看100,50

首先让我们退后一步:Convert.ToDouble(tbxDouble.Text)此行从字符串转换为double,值为100.50,此时您已完成两个不同的舍入。

第一个:

value.ToString("F0");

正在使用零舍入

第二个:

Math.Round(value, 0)

正在使用Bankers Rounding

银行家舍入将四舍五入到最接近的偶数数字 - 因此结果将为100.远离零舍入将舍入到101(101比零更“远离100”)

答案 1 :(得分:0)

如果要舍入到大于或等于的最小整数值,则必须使用Math.Ceiling 像这样的东西

     class Program
{
    static void Main(string[] args)
    {
        double v2 = 100.56;
        double v3 = 100.49;
        Console.WriteLine(Math.Ceiling(v2));
        Console.WriteLine(Math.Ceiling(v3));

    }
}

答案 2 :(得分:0)

我发现了错误。我们不应该使用Math.Round,因为有时结果是错误的。我们应该使用如下:

tbxInt3.Text = Math.Round(Convert.ToDouble(tbxDouble.Text), 0, MidpointRounding.AwayFromZero).ToString();

这是正确的结果:

100,5 =>的结果101

100,56 =>的结果101

100,49 =>的结果100

More information link