我正在为一个学校项目(自行车工厂)编制一个库存/生产计划,我必须把一些数字加起来,比如必须生产的自行车(由于产生的影响,它是双倍的)。
如果我使用以下代码:
double test = Math.Ceiling(100 * 1.09);
label75.Text = Convert.ToString(test);我得到的答案是110,但这是不对的,应该是109 (占100的9%)。尽管它似乎适用于低于9%的数值。
我做错了什么?
发布于 2013-09-11 21:00:49
doubles和floats是二进制浮点类型。这意味着它们不能精确地表示许多十进制数(如1.09)。这会导致一些微妙的错误。在您的示例中,100 * 1.09实际上导致的数字略大于109,因此Ceiling函数正确地将其舍入到最接近的整数110。
将其更改为decimal,就会得到预期的结果:
decimal test = Math.Ceiling(100 * 1.09m); // 109注意,m在1.09m中将其标识为decimal文本。这是因为decimal类型是专门设计来表示十进制数的(而不仅仅是它们的二进制近似,就像double和float那样)。
发布于 2013-09-11 21:02:03
浮点算法不在基10中,在基2中。double类型没有与1.09完全相同的基-2。
为了说明,如果您在以下程序的末尾放置了一个断点
public static void Main()
{
double test = 100 * 1.09;
}比test以109.00000000000001的形象出现
https://stackoverflow.com/questions/18751156
复制相似问题