如何检查输入double值包含多少位数?

时间:2014-04-24 23:44:58

标签: c# algorithm

我需要一个double值来包含"。"之后的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&lt; = 4 - 这是有效的。但是,当我将num更改为20.15时,它不会,因为(num - Math.Floor(num))此处将返回0.14999999999

还有其他好主意吗?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

如果您真的担心基数为10的小数位数,请使用decimal代替double

decimal用于计算财务计算,首先它被称为decimal的原因是它可以更好地处理基数10计算,如美元和美分。

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

return num % 0.01m == 0.0m;

答案 2 :(得分:0)

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

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

例如

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

(它的3因为长度是最大指数+ 1)