我正在为一个学校项目(自行车工厂)编写库存/生产计划,我必须将一些数字四舍五入,例如必须生产的自行车(由于余波,它是双倍的)。
如果我使用以下代码:
double test = Math.Ceiling(100 * 1.09);
label75.Text = Convert.ToString(test);
我得到的答案是 110,但这是不对的,它应该是 109(100 的 9%)。尽管它似乎适用于低于 9% 的值。
我究竟做错了什么?
我正在为一个学校项目(自行车工厂)编写库存/生产计划,我必须将一些数字四舍五入,例如必须生产的自行车(由于余波,它是双倍的)。
如果我使用以下代码:
double test = Math.Ceiling(100 * 1.09);
label75.Text = Convert.ToString(test);
我得到的答案是 110,但这是不对的,它应该是 109(100 的 9%)。尽管它似乎适用于低于 9% 的值。
我究竟做错了什么?
double
s 和float
s 是二进制浮点类型。这意味着它们不能精确地表示许多十进制数(如1.09
)。这会导致一些细微的舍入错误。在您的情况下,100 * 1.09 实际上会产生一个比 109 稍大的数字,因此该Ceiling
函数正确地将其向上舍入到最接近的整数 110。
将其更改为 a decimal
,您将获得预期的结果:
decimal test = Math.Ceiling(100 * 1.09m); // 109
请注意m
in1.09m
将其标识为decimal
文字。这是有效的,因为该decimal
类型专门设计用于表示十进制数(而不仅仅是它们的二进制近似值,就像double
和float
做的那样)。
浮点运算不是以 10 为底,而是以 2 为底。该double
类型没有精确的以 2 为底的等价物1.09
为了说明,如果你在以下程序的末尾放置一个断点
public static void Main()
{
double test = 100 * 1.09;
}
比test
显示为109.00000000000001