我需要一个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
。
还有其他好主意吗?
答案 0 :(得分:1)
这是二进制浮点数的性质。就像1/3不能完全写出有限的十进制数一样,0.1不能用有限的二进制展开来精确表示。
因此,根据您想要达到的目标,您可以:
如果您要验证某些字符串输入(例如文本框),则可以在字符串级别处理信息,例如使用RegEx。
您可以将数字存储在decimal
数据类型中,该数据类型可以精确存储十进制值。
你可以在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)