2012-02-21 83 views
2

好吧,这是事情。从DataTable我读number_of_projectnumber_of_hours_per_day(大部分时间每天5至7小时)。对于每个项目我插入percentage_value与动态创建TextBoxes(总结所有百分比值是100%)。百分比公式必须计算hours_for_project_per_day在c中使用百分比#

double hours_for_project_per_day = percentage_value * number_of_hours_per_day/100; 

在结束我Roundhours_for_project_per_day。在无数次的计算是正确的,但我的情况下,获得(因为Rounding)一些非正确的价值观是这样的:

number_of_project = 5; 
number_of_hours_per_day = 7; 

percentage_value | project | (Math.Round)hours_for_project_per_day (double values) 
-----------------|---------|------------------------------------------------------ 
      30 | P1 | 2 (2,1) 
      17 | P2 | 1 (1,19) 
      18 | P3 | 1 (1,26) 
      20 | P4 | 1 (1,4) 
      15 | P5 | 1 (1,05) 
------------------------------------------- 
sum  100 | 5 | 6 (instead 7) 

我的问题是:我可以这样做一些其他的方式只是检查 if(sum_hours_for_project_per_day != number_of_hours_per_day)并找到hours_for_project_per_day与最大十进制值(在这种情况下,1,4),并把值2? 希望你知道我在做什么。

+0

将100更改为100.0:double hours_for_project_per_day = percentage_value * number_of_hours_per_day/100; – 2012-02-21 11:58:18

+1

好吧,没有得到这个事实,即分数的总和和它们的舍入值的总和是不同的。这只是数学:)我会建议将他们四舍五入到2,3或任何小数位(不会解决您的问题,但会减少它),或与您的第二个想法,这对我来说似乎可以。 – 2012-02-21 11:58:38

+0

您是否正在使用可以查询的数据库? – Peter 2012-02-21 11:58:53

回答

9

只将信息舍入输出到用户界面。

您应该使用非舍入数字执行所有计算。

编辑 针对的事实,你必须圆角值存储在基于百分比作风投入的分贝我会说这就是在要求的缺陷。在某天结束时,必须决定在哪里分配额外的时间,这最好由用户完成 - 最简单的方法是让他们分配整个小时数。

如果这是不可能的,我会倾向于让用户提示他们需要选择哪个值碰撞 - 有一个论点,也许它会更好地撞上2,1值而不是1 ,4值。这是一个商业决定,但不是技术性的。

+0

这确实是一个很好的建议。 +1 – ken2k 2012-02-21 12:20:29

+0

问题是我必须向数据库插入四舍五入的值。 – JanOlMajti 2012-02-21 13:07:33

+0

你是对的,我碰到了2.1,这更合乎逻辑。好的建议,谢谢。 – JanOlMajti 2012-02-21 13:40:24