【问题标题】:How to check input double value contain how many digits?如何检查输入的双精度值包含多少位?
【发布时间】:2014-04-24 23:44:57
【问题描述】:

我需要一个双精度值来包含“.”之后的 2 位数字,例如 2.15、20.15。如果输入值为 3.125,则应打印错误消息。

我的代码是:

    private static bool isTwoDigits(double num)
    {
        return (num - Math.Floor(num)).ToString().Length <= 4;
    }

如果您输入 2.15,那么它将是 2.15 -2 = 0.15 num 更改为 20.15 时,它不会,因为这里的(num - Math.Floor(num)) 将返回0.14999999999

还有什么好主意吗?

【问题讨论】:

  • 这在stackoverflow.com/questions/3359916/…之前已经问过了
  • 这已经被问过了。 stackoverflow.com/questions/3359916/…
  • @user430788:这不是完全相同的问题。这里的问题不是如何对数字进行四舍五入,而是如何断言给定数字的小数位数。
  • @user430788 好像不一样
  • 哦,很公平。然后是的,对其进行正则表达式并计算 . 之后的内容的长度

标签: c# algorithm


【解决方案1】:

这是二进制浮点数的本质。就像 1/3 不能完全写成有限十进制数一样,0.1 也不能完全用有限二进制展开来表示。

因此,根据您要达到的具体目标,您可以:

  1. 如果您正在验证某些字符串输入(例如文本框),您可以在字符串级别处理信息,例如使用正则表达式。

  2. 您可以将数字存储在 decimal 数据类型中,该数据类型可以精确存储十进制值。

  3. 您可以在double 上进行计算,但您必须给自己一个容忍度。如果您只期望 2 位精度,则可以执行 Math.Abs(x - Math.Round(x, 2)) &lt; 0.00000001) 之类的操作。此容差范围的定义取决于您的用例。

【讨论】:

  • 谢谢它的帮助!
【解决方案2】:

如果您真的担心小数位数,请使用以 10 为底的数字,使用 decimal 而不是 double

decimal 用于计算财务计算,之所以称为decimal,首先是为了更好地处理以 10 为基数的计算,例如美元和美分。

您还可以更简单地检查数字是否为2位。

return num % 0.01m == 0.0m;

【讨论】:

  • 我使用你的解决方案“return num % 0.01 == 0;”但它不起作用!
  • 它只适用于十进制数据类型。这就是常量上的m 后缀的含义。
【解决方案3】:

如前所述,您可以使用正则表达式来确保整个格式正确。

但如果你知道只有 1 个小数,因为它已经是一个数字,你也可以只使用 String.IndexOf

例如

double foo = ....  ;
string fooString = foo.ToString();
if (fooString.Length - fooString.IndexOf(".") != 3)  => error.

(它是 3,因为 Length 是最大索引 + 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2019-07-09
    • 2023-03-05
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多