在Javascript中验证浮点精度

时间:2014-05-01 17:03:38

标签: javascript regex validation floating-point

我尝试使用Javascript来验证用户输入是否为有效的货币(美元和美分)金额,小数点右侧不超过两位数。

向左移动,然后执行模1失败,因为固有的浮点问题:

(parseFloat("19.99") * 100) % 1 // Returns 0.9999999999997726

我知道BigDecimal库,但我不确定转换为BigDecimal然后进行验证是正确的方法,因为它可以掩盖无效输入和浮点的问题。

目前,我的解决方法是针对以下正则表达式测试原始(字符串)输入:

/^\d*((\.\d{0,2})?)$/

这是否足以保证输入是货币格式的有效浮点数?如果没有,是否有基于数学的方法进行验证?

2 个答案:

答案 0 :(得分:2)

你的正则表达式也会匹配空输入,这是不对的。

请尝试使用此正则表达式:

^(?=[^.])\d*(?:\.\d{0,2})?$

Working Demo

  • (?=[^.])是一个预测,它将确保输入中至少有一个非点字符,以避免匹配空字符串。

答案 1 :(得分:2)

如果你不需要使用RegExp,那么让JS的数学运算起来很重要:

 var n=myInput.value;
 if(!n || +(+n || 0).toFixed(2) != +n) {  
   alert("real numbers only!"); 
   myInput.select(); 
 }

验证例程部分组成并且用户体验很差,但数学是坚实且防弹的。