C#没有正确计算小数结果

时间:2014-01-23 19:47:04

标签: c# decimal

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

decimal Test = (5 / 15) * 1185;

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

4 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:5)

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

decimal Test = (5 / 15.0) * 1185;

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

答案 2 :(得分:0)

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

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

十进制值类型表示十进制数,范围从正数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

答案 3 :(得分:0)

你也可以使用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