我正在为一个学校项目(自行车工厂)编制一个股票/生产计划,我不得不围绕一些数字,例如必须生产的自行车(因为它是双重的,因为它是双倍的)。
如果我使用以下代码:
double test = Math.Ceiling(100 * 1.09);
label75.Text = Convert.ToString(test);
我得到答案110,但那不对,它应该是109(100%的9%)。虽然它的值似乎低于9%。
我做错了什么?
答案 0 :(得分:28)
double
和float
是二进制浮点类型。这意味着它们不能精确地表示许多十进制数(如1.09
)。这导致一些微妙的舍入错误。在你的情况下,100 * 1.09实际上会产生一个略大于109的数字,因此Ceiling
函数会将其正确地舍入到最接近的整数110。
将其更改为decimal
,您将获得预期的结果:
decimal test = Math.Ceiling(100 * 1.09m); // 109
请注意m
中的1.09m
将其标识为decimal
字面值。这是有效的,因为decimal
类型专门用于表示十进制数字(而不仅仅是它们的二进制近似值,如double
和float
所做的那样)。
答案 1 :(得分:7)
浮点运算不在基数10中,它在基数2中。double
类型没有精确的基数-2等价于1.09
为了说明,如果你在以下程序的末尾加上一个断点
public static void Main()
{
double test = 100 * 1.09;
}
比test
显示为109.00000000000001