在 C# 中针对浮点数验证整数值

Posted

技术标签:

【中文标题】在 C# 中针对浮点数验证整数值【英文标题】:Validating an integer value against float in 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(双精度表示这样的值)。 【参考方案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 那里

以上是关于在 C# 中针对浮点数验证整数值的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 深入学习及常用工具方法整理 ---- 01.浮点数

js中如何判断两个浮点数是不是相等

在 C 中,如何将浮点数或双精度数除以 2 的 i 次幂?

为啥 SQL 浮点数与 C# 浮点数不同

浮点数在c中的基数排序

MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数