【问题标题】:Validating an integer value against float in C#在 C# 中针对浮点数验证整数值
【发布时间】:2021-12-21 07:19:41
【问题描述】:

我有一个文本框,用户可以在其中输入双点数。例如:-

1.00
1.0000
1.23
1.000000

等,可以从用户界面输入双数。

在我的 C# 代码中,我必须验证用户是否输入了 1。

1.00
1.0000
1.000000

都被认为是 1 并且通过了验证。 我正在考虑转换为 Int

public bool Validate(double number)
{
  int v = Convert.ToInt32(number)
  if(v == 1)
   return true;
}

但问题是我会失去精度,1.00 和 1.001 都将导致 1 并且错误地 1.001 将返回为我不需要的 true。 如何检查用户是否在 C# 的 UI 中输入了 1.00,1.000,...等?

编辑: 对于 1.23、1.001 等数字,我不需要 true

【问题讨论】:

  • 这能回答你的问题吗? Floating point comparison functions for C#
  • 我一定是遗漏了什么——为什么不只是return (number == 1)
  • 请注意,用户仍然可以输入诸如“1.0000000000000001”之类的内容,无论如何它将等于 1,因为它将(使用double.Parse)解析为 1(双精度表示这样的值)。

标签: c# .net asp.net-core c#-4.0


【解决方案1】:

将值与 1.0 进行比较应该可以解决问题:

bool isOne = val == 1.0;

(浮点数的等式比较可能会很棘手,但这个比较符合您的预期。)

编辑:使用 1 代替 1.0 也可以,正如 Matthew Watson 在 cmets 中所建议的那样。

【讨论】:

    【解决方案2】:

    你可以使用decimal数据类型

    public bool Validate(double number)
    {
        var num = decimal.Parse(number.ToString());
        if(num == 1)
            return true;
        return false;
    }
    

    【讨论】:

    • 它会为1.23 返回“true”吗? =)
    • 没有。它只会为 1.0、1.00000、1.0000000000 或 1 返回 true
    • OP 需要它对于 1.23 来说是真的
    • 将双精度转换为十进制有什么意义,虽然是一个字符串?
    • @VA1267 你的问题说明了什么 - " 例如:- 1.00 1.0000 1.23 1.000000 都是有效的。" 我清楚地看到1.23 那里
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2012-03-08
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多