9

我正在为一个学校项目(自行车工厂)编写库存/生产计划,我必须将一些数字四舍五入,例如必须生产的自行车(由于余波,它是双倍的)。

如果我使用以下代码:

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

label75.Text = Convert.ToString(test);

我得到的答案是 110,但这是不对的,它应该是 109(100 的 9%)。尽管它似乎适用于低于 9% 的值。

我究竟做错了什么?

4

2 回答 2

28

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

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

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

请注意min1.09m将其标识为decimal文字。这是有效的,因为该decimal类型专门设计用于表示十进制数(而不仅仅是它们的二进制近似值,就像doublefloat做的那样)。

于 2013-09-11T21:00:49.170 回答
7

浮点运算不是以 10 为底,而是以 2 为底。该double类型没有精确的以 2 为底的等价物1.09

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

public static void Main()
{

    double test = 100 * 1.09;
}

test显示为109.00000000000001

于 2013-09-11T21:02:03.523 回答