c# - 在一个简单的数学问题后得到随机数。可能是局部变量
问题描述
我有一个在前端工作的 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。这不是随机的,我可以看出我在选择单词时也很糟糕。但我不明白有什么问题
解决方案
当我给 14.00 作为输入和 13.00 作为输出时,我得到 -76
您正在解析世界的一部分,那里.
不是小数分隔符,而是常见的“组”分隔符。也就是说,写的是十万加四分之一这样的数字100.000,25
,而不是像在美国那样,100,000.25
。 Parse
假定字符串采用当前用户区域设置的格式,除非您另有说明。
因此,您将字符串解析为值1400
和1300
. 它们的差是-100
,小于 0,因此您将 24 与 -100 相加得到 -76。
你的其他情况也一样。你有1850
和1025
,减去它们得到-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 分钟怎么办?如果分钟或小时完全丢失怎么办?等等。
一旦有了规范,就编写验证规范的测试用例。然后编写一个实现,并运行你的测试。如果您先编写测试,则代码更有可能是正确的。
推荐阅读
- python - 用于为科学博览会展位创建自定义打印材料的 Python 脚本
- ios - 从 FCM 通知数据 IOS 检索数据并打开视图控制器
- sql - 在 WHERE 子句中使用 CASE 语句
- xpath - 用于获取名称和 URL 模式的 Xpath
- c# - 当 Datetime.Month 开始新的一个月时删除元素?MVC5
- javascript - 克隆动态对象并重置(清空)其值
- python - Scrapy - 在第一次请求后禁用 Selenium
- memory - UEFI 引导的内核:静态物理内存布局
- sql - 将 Postgres 查询结果合并到一张表中
- python - Conda 命令带有无效的语法错误