代码之家  ›  专栏  ›  技术社区  ›  Jakob Busk Sørensen

十进制和数学运算

  •  19
  • Jakob Busk Sørensen  · 技术社区  · 7 年前

    decimal 在C#中。看起来是这样的:

    private decimal BaseValue
    {
        get; set;
    }
    
    public decimal ConvertedValue 
    {
        get
        {
            return BaseValue * (365 / 360);
        }
    }
    

    然而,这不起作用。我假设是因为C#将分数中的数字处理为整数。所以我可以这样做(这很有效):

    public decimal ConvertedValue 
    {
        get
        {
            return BaseValue * (decimal)((double)365 / (double)360);
        }
    }
    

    这看起来有点过分,但我可以接受。我的主要问题是:

    (double) 铸造如果我删除 (双倍) (decimal)

    10 回复  |  直到 7 年前
        1
  •  25
  •   Mong Zhu Bart de Boer    7 年前

    decimal 用一个 m 最后

    return BaseValue * (365m / 360m);
    

    因为当你有一个 double 在等式的一侧,结果将是一个双精度。

    (double)365 / (double)360
    

    看一看 the documentation of the * operator overloads

    decimal operator *(decimal x, decimal y);


    ... 然后(十进制)转换变得多余。

    十进制的

    BaseValue * (decimal)(365 / 360)
    

    这里的问题是范围!你将除法的全部结果转换为 十进制的 . 实际上,只需去掉括号即可解决问题:

    return BaseValue * 365 / 360;
    

    * 乘法将是一个 十进制的 十进制的

    删除括号通常与保留括号不同。在某些情况下,当浮点运算的顺序发生变化时,即使这两个表达式在数学上完全相同,结果也会有所不同。评论人 Banex

    编辑:

    m 字面意义的 . 有关所有类型后缀或 可以在 documentation here

        2
  •  8
  •   René Vogt    7 年前

    这个 decimal 十进制的 .

    两者中的一个 double 强制转换是多余的,因为当您强制转换其中一个 int 双重的 ,很明显,您使用 双重的

    但只要使用 十进制的 m :

    return BaseValue * (365m / 360);
    

    m


    但是嘿, BaseValue 十进制的

    return BaseValue * 365 / 360;
    
        3
  •  4
  •   Zumoka    7 年前

    使用m后缀:

    return 365m/360 * BaseValue;
    
        4
  •  4
  •   SᴇM    7 年前

    某些类型的数字有一些后缀,例如:

     // Use long suffix.
     long l1 = 10000L;
    
     // Use double suffix.
     double d1 = 123.764D;
    
     // Use float suffix.
     float f1 = 100.50F;
    
     // Use unsigned suffix.
     uint u1 = 1000U;
    
     // Use decimal suffix.
     decimal m2 = 4000.1234M;
    
     // Use unsigned suffix and long suffix.
     ulong u2 = 10002000300040005000UL;
    

    public decimal ConvertedValue 
    {
        get
        {
            return BaseValue * (365 / 360M);
        }
    }
    

    当你使用大写后缀时,它也更清晰:

        5
  •  4
  •   sofsntp    7 年前

    您只需在其中一个数字上添加一个m后缀,使其成为十进制:

    return BaseValue * (365 / 360m);
    
        6
  •  2
  •   willeM_ Van Onsem    7 年前

    你可以简单地使用 十进制文字 ,通过使用 m 后缀

    public decimal ConvertedValue 
    {
        get
        {
            return BaseValue * (365m/360);
        }
    }

    第二次强制转换是多余的,因为C#派生出您的 ((double)365 / (double)360) 表达式是 double 双重的 (double) 作为第二个元素:

    csharp> (double) 365/350        
    1.04285714285714                
    csharp> (double) 365/ (double) 350
    1.04285714285714
    

    然而,将其转换为双数,然后再转换为小数,这是非常无用的。通过在表达式中使用一个十进制文字,另一个数字也将是十进制,因此我们保持在 decimal 世界

        7
  •  2
  •   Damien Flury    7 年前

    在您的示例中,您可以去掉括号:

    return BaseValue*365/360;
    
        8
  •  2
  •   Yair Halberstadt    7 年前

    return BaseValue * (decimal)(365/(double)360);
    

    很好用。

    或者

    return (BaseValue*365)/360;
    

    return BaseValue*365/360;
    

    因为乘法的优先级高于除法。

        9
  •  0
  •   user47589 user47589    7 年前

    如果简单地将数字指定为小数,则长度会更短:

     return BaseValue * (365m /360);
    
        10
  •  0
  •   Gem Taylor    7 年前

    如果一个操作的任何参数是double,则另一个参数将自动转换为double。 你能把其中一个参数写成实数常数吗,例如365.0?