围绕c#给出错误的答案

时间:2013-09-11 20:58:00

标签: c# .net math floating-point double

我正在为一个学校项目(自行车工厂)编制一个股票/生产计划,我不得不围绕一些数字,例如必须生产的自行车(因为它是双重的,因为它是双倍的)。

如果我使用以下代码:

double test = Math.Ceiling(100 * 1.09);

label75.Text = Convert.ToString(test);

我得到答案110,但那不对,它应该是109(100%的9%)。虽然它的值似乎低于9%。

我做错了什么?

2 个答案:

答案 0 :(得分:28)

doublefloat是二进制浮点类型。这意味着它们不能精确地表示许多十进制数(如1.09)。这导致一些微妙的舍入错误。在你的情况下,100 * 1.09实际上会产生一个略大于109的数字,因此Ceiling函数会将其正确地舍入到最接近的整数110。

将其更改为decimal,您将获得预期的结果:

decimal test = Math.Ceiling(100 * 1.09m); // 109

请注意m中的1.09m将其标识为decimal字面值。这是有效的,因为decimal类型专门用于表示十进制数字(而不仅仅是它们的二进制近似值,如doublefloat所做的那样)。

答案 1 :(得分:7)

浮点运算不在基数10中,它在基数2中。double类型没有精确的基数-2等价于1.09

为了说明,如果你在以下程序的末尾加上一个断点

public static void Main()
{

    double test = 100 * 1.09;
}

test显示为109.00000000000001