首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >舍入c#给出错误的答案

舍入c#给出错误的答案
EN

Stack Overflow用户
提问于 2013-09-11 20:58:00
回答 2查看 1K关注 0票数 9

我正在为一个学校项目(自行车工厂)编制一个库存/生产计划,我必须把一些数字加起来,比如必须生产的自行车(由于产生的影响,它是双倍的)。

如果我使用以下代码:

代码语言:javascript
复制
double test = Math.Ceiling(100 * 1.09);

label75.Text = Convert.ToString(test);

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

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-11 21:00:49

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

将其更改为decimal,就会得到预期的结果:

代码语言:javascript
复制
decimal test = Math.Ceiling(100 * 1.09m); // 109

注意,m1.09m中将其标识为decimal文本。这是因为decimal类型是专门设计来表示十进制数的(而不仅仅是它们的二进制近似,就像doublefloat那样)。

票数 28
EN

Stack Overflow用户

发布于 2013-09-11 21:02:03

浮点算法不在基10中,在基2中。double类型没有与1.09完全相同的基-2。

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

代码语言:javascript
复制
public static void Main()
{

    double test = 100 * 1.09;
}

test109.00000000000001的形象出现

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18751156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档