【问题标题】:Converting double to int returns unexpected results将 double 转换为 int 会返回意外结果
【发布时间】:2017-07-07 12:23:15
【问题描述】:

我想显示doubleint 的数字转换。但我很困惑。这是我的代码。

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?这有什么问题?

【问题讨论】:

  • 哦,逗号是英文小数点。没有立即看到这一点,我感到非常省心。
  • 是的,根据我的操作系统,逗号是小数点。迈克尔有什么问题?
  • 为什么在您看来100,49 应该是101
  • 也许打印中间值而不是直接将它们放入ToString() 会有所帮助。查看来自 `Convert.ToDouble(tbxDouble.Text) 的确切内容可能会让事情更容易看到。
  • @lotomax 仅当您首先将 100,49 转换为小数点后一位,然后再转换为小数点零位时,它才会像您所描述的那样工作 - 如果您想一步转换为整数值,它将是 100

标签: c# int type-conversion double decimal


【解决方案1】:

如果你想四舍五入到大于或等于的最小整数值,你必须使用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));

    }
}

【讨论】:

  • 结果是; 101和101和100。我想应该都是101作为数学规则吧?
  • 根据数学规则;应该是 101 - 101 - 100 好吗?
【解决方案2】:

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

我假设 100,49 和 100,56 的情况很明显,所以我们来看看 100,50

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

第一个:

value.ToString("F0");

正在使用远离零舍入

第二个:

Math.Round(value, 0)

正在使用银行家四舍五入

银行家四舍五入将四舍五入到最接近的 偶数 - 所以结果将是 100。远离零的四舍五入将四舍五入到 101(101 比 100 离零“更多”)

【讨论】:

  • 为什么“F0”返回101?您的回答似乎无法解释。
  • F0 只是“减少”小数位 - 结果应该是 100。这里没有四舍五入。感谢您指出 - 我将编辑我的帖子以使其更清晰
  • 但是如果它减少小数,那它为什么不返回100
  • 这个答案是错误的,它是如何被投票 4 次的,这超出了我的理解。 “F0”根本不截断数字。它将数字四舍五入,就像 OP 节目中的其他示例一样。这里的问题是舍入标准似乎与Math.Round 使用的不同。
  • @InBetween 是的,你是对的 - 我的错误 - F0 不会截断,它将使用“AwayFromZero”舍入。我的错误是因为文档中的一行说“请注意,精度说明符控制数字字符串表示中的位数。它不会对数字本身进行四舍五入。”但我错过了下一部分:“当精度说明符控制结果字符串中的小数位数时,结果字符串反映了从零四舍五入的数字(即使用 MidpointRounding.AwayFromZero)。” msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx
【解决方案3】:

我发现了错误。我们不应该使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多