【问题标题】:How does DoubleUtil.DoubleToInt(double val) work?DoubleUtil.DoubleToInt(double val) 如何工作?
【发布时间】:2013-08-08 18:52:33
【问题描述】:

MS.Internal.DoubleUtil-Class 包含函数

public static int DoubleToInt(double val)
{
    return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}

我想知道为什么这会将 val 转换为整数?

【问题讨论】:

    标签: c# wpf int double


    【解决方案1】:

    对于大于 0 的数字,它会增加 0.5 并截断。对于数字

    (int) 转换实际上是截断的,所以 (int)7.8 == 7(int)-7.8 == 7(int)7.995 == 7 等等。

    所以我们有:

    0-0.499999... is rounded to 0 (0.499999 + 0.5 == 0.999999 trucated == 0)
    0.5-1... is rounded to 1 (1 + 0.5 == 1.5 truncated == 1) 
    

    等等。

    负数则相反。

    边界情况(int.MinValue - int.MaxValue 范围之外的值)可能会被忽略,Double 特殊值(NaNPositiveInfinityNegativeInfinity)也会被忽略

    一些double 数字可能存在一些问题,因为double 不是“精确的”(解释起来很复杂,请尝试寻找双精度数不好的原因),而且通常你看到的并不是你所拥有的,所以你可以得到你认为是 1.5 但实际上是 1.499999999999985 的值,所以它被舍入到 1 而不是 2。

    类似:

    double d = 11.3;
    
    // There are 20x += 0.01 
    d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
    d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
    d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
    d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
    
    Console.WriteLine("{0}", d);
    Console.WriteLine("{0:R}", d);
    Console.WriteLine("{0}", DoubleToInt(d));
    

    结果:

    11.5
    11.499999999999996
    11
    

    【讨论】:

      【解决方案2】:

      这仅仅是因为它投射(int)。 + 或 - 仅用于对值进行四舍五入。

      【讨论】:

        【解决方案3】:

        从 double 到 int 的转换总是占用地板,因此添加 0.5(如果为负数则减去 0.5)意味着 1.6 返回 2,而 1.4 将返回 1。

        【讨论】:

          猜你喜欢
          • 2017-08-13
          • 2021-05-24
          • 2021-12-18
          • 2011-02-28
          • 1970-01-01
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多