【问题标题】:C# not calculating a decimal result properly [duplicate]C#没有正确计算小数结果[重复]
【发布时间】:2014-01-23 19:47:04
【问题描述】:

(5 / 15) * 1185 应该是 395。

decimal Test = (5 / 15) * 1185;

然而,这返回 0。我做错了什么?

【问题讨论】:

    标签: c# decimal


    【解决方案1】:

    5 / 15是整数除法,返回0。使用5m / 15m强制decimal

    m 是 C# 后缀,用于向编译器表明您编写的数字是 decimal,即使它看起来像 int。你可以使用f 来表示浮点数,d 可以表示双精度数(或5.0)。

    关于后缀的话题,还有L 代表long,但这对你的除法没有帮助,因为它也是一个整数类型。

    5 // Int32
    5L // Int64
    5d // Double
    5.0 // Double
    5m // Decimal
    5f // Single
    

    【讨论】:

      【解决方案2】:

      您需要使用浮点除法,而不是整数除法。您可以通过将其设为浮点数或在 15 后面使用m(将其指定为decimal)来获得正确的结果:

      decimal Test = (5 / 15.0) * 1185;
      

      decimal Test = (5 / 15m) * 1185;
      

      【讨论】:

        【解决方案3】:

        你也可以使用 lambda 表达式:

        Func<decimal, decimal, decimal, decimal> exp = (x, y, z) => (x / y) * z;
        Console.WriteLine(exp(5, 15, 1185));
        

        输出: 394.999999

        正如您所期望的 395,您需要使用 Math.Round

        Console.WriteLine(Math.Round(exp(5, 15, 1185), 1));
        

        输出:395.0

        【讨论】:

          【解决方案4】:

          5/15 为 0,因为您使用的是整数除法。 您可以尝试使用以下代码之一:

          decimal test = (5m / 15) * 1185
          decimal test = ((decimal)5 / 15) * 1185
          decimal test = (5.0 / 15) * 1185
          

          Decimal 值类型表示从正数 79,228,162,514,264,337,593,543,950,335 到负数 79,228,162,514,264,337,593,543,950,335 的十进制数。 Decimal 类型并没有消除舍入的需要,而是最大限度地减少了舍入导致的错误。

          链接:http://msdn.microsoft.com/en-us/library/364x0z75

          【讨论】:

            猜你喜欢
            • 2018-08-27
            • 1970-01-01
            • 1970-01-01
            • 2022-09-29
            • 1970-01-01
            • 2017-05-16
            • 1970-01-01
            • 1970-01-01
            • 2017-07-02
            相关资源
            最近更新 更多