首页 > 解决方案 > 在一个简单的数学问题后得到随机数。可能是局部变量

问题描述

我有一个在前端工作的 GUI。但在后端,我的数学有点问题。代码试图计算只有开始和结束时间已经过去了多少时间。(没有关于日期的信息)。所以我想我找到了计算在纸上花费的时间的方法。但是在 C# 中我失败了,我认为是因为局部变量的东西。

float start = float.Parse(textBox1.Text);
float end = float.Parse(textBox2.Text);
float hours_spent = end - start;
if (start > end) {
    hours_spent = 24.00f -start + end;
}

第一部分工作正常,但是当我给 start 大于 end 时,它给了我随机数。

编辑:当我给 14.00 作为输入和 13.00 作为输出时,我得到 -76,对于输入 14.00,输出 12.00 我得到 -176,对于 18.50 到 10.25,我得到 -801。这不是随机的,我可以看出我在选择单词时也很糟糕。但我不明白有什么问题

标签: c#typeslocal-variables

解决方案


当我给 14.00 作为输入和 13.00 作为输出时,我得到 -76

您正在解析世界的一部分,那里.不是小数分隔符,而是常见的“组”分隔符。也就是说,写的是十万加四分之一这样的数字100.000,25,而不是像在美国那样,100,000.25Parse假定字符串采用当前用户区域设置的格式,除非您另有说明。

因此,您将字符串解析为值14001300. 它们的差是-100,小于 0,因此您将 24 与 -100 相加得到 -76。

你的其他情况也一样。你有18501025,减去它们得到-825,加24你得到-801

这里根本没有“随机”的东西。一切都按预期工作。

这里有一个教训:向后工作。你得到-76。那是怎么发生的?你一定在某事上加了 24。什么加到 24 给你 -76?-100。我们是如何得到 -100 的?等等。

重新开始。你不应该首先解析浮点数。如果这是一个小数,那么你应该解析一个小数,如果你知道它总是.作为小数分隔符,你应该在解析它时说出来。(提示:使用TryParse带有 a的版本NumberStyles并正确设置样式。)

另一方面,如果您知道这是由句点分隔的两个整数,则不应将其解析为小数或浮点数。您应该解析一个整数,然后是句点,然后是整数。

如果这是几小时,然后是一段时间,然后是几分钟,那么再次,您不应该使用上述任何一种。使用日期和时间解析器来解析日期和时间。

简而言之:为您实际要做的工作使用正确的工具

您的代码的其他问题:

  • 在处理用户输入时使用TryParse, not 。Parse你不知道那里有一个有效的数字,但Parse如果输入错误就会崩溃。
  • 你的数学可能是错误的。如果有人输入 100 和 200,你真的想要 -76 作为输出吗?

退后一步,问问自己,您要在这里构建的真正业务流程是什么。 仔细写下该业务流程,然后实施该流程,而不是它的近似值。您的业​​务流程可能不会说“使用当前语言环境的规则解析浮点数”,但这就是您编写的代码。编写代码,准确表达您的意思

更新:对该问题的评论表明您陷入了多么深的洞:

如果进入时间是 13.55,退出时间是 14.05,那么预期的逻辑结果应该是什么?应该是 10(分钟)还是 50(数字差)?

我期待 10 分钟

那么绝对不应该将其解析为浮点数或小数!解析为浮点数或小数显然是完全错误的,因为1.1和 与1.10数字的值相同,但如果是“小时.分钟”,则有九分钟不同,并且您无法通过解析为数字来判断您处于哪种情况。

再次,您需要停止编写代码,删除到目前为止已编写的所有内容,然后重新开始。你在一个洞里:停止挖得更深,把洞填满,然后回到地面。

你需要弄清楚你的字符串是什么格式,并准确地解析那个格式不是别的

因此,编写一个规范,提出并回答有关什么是允许的,什么是不允许的问题。是否允许负值?如果分钟数超过 60 分钟怎么办?如果分钟或小时完全丢失怎么办?等等。

一旦有了规范,就编写验证规范的测试用例。然后编写一个实现,并运行你的测试。如果您先编写测试,则代码更有可能是正确的。


推荐阅读