【发布时间】:2014-01-23 19:47:04
【问题描述】:
(5 / 15) * 1185 应该是 395。
decimal Test = (5 / 15) * 1185;
然而,这返回 0。我做错了什么?
【问题讨论】:
(5 / 15) * 1185 应该是 395。
decimal Test = (5 / 15) * 1185;
然而,这返回 0。我做错了什么?
【问题讨论】:
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
【讨论】:
您需要使用浮点除法,而不是整数除法。您可以通过将其设为浮点数或在 15 后面使用m(将其指定为decimal)来获得正确的结果:
decimal Test = (5 / 15.0) * 1185;
或
decimal Test = (5 / 15m) * 1185;
【讨论】:
你也可以使用 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
【讨论】:
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 类型并没有消除舍入的需要,而是最大限度地减少了舍入导致的错误。
【讨论】: