【问题标题】:Validating Floating Point Precision in Javascript在 Javascript 中验证浮点精度
【发布时间】:2014-05-01 17:03:38
【问题描述】:

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

由于固有的浮点问题,左移,然后执行模 1 失败:

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

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

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

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

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

【问题讨论】:

  • 是否允许.77.
  • 是的,“7”、“7.7”和“0.7”也是如此
  • (+(n).toFixed(2) == +n)
  • 丹,你介意把它作为一个正式的答案,以便我标记它吗?

标签: javascript regex validation floating-point


【解决方案1】:

如果你不需要使用 RegExp,让 JS 的数学来做繁重的工作:

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

验证例程部分是虚构的,用户体验很差,但数学是可靠的和防弹的。

【讨论】:

  • 以上将在 n=0 时失败!n,不是吗? (让我们不要进入“零是实数:-))
  • @G.Stoynev 我认为这是理想的行为,但如果需要,处理这种情况很容易......
【解决方案2】:

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

试试这个正则表达式:

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

Working Demo

  • (?=[^.]) 是一种前瞻功能,可确保输入中至少有一个非点字符以避免匹配空字符串。

【讨论】:

  • 匹配“12”。是所需的功能。不过,我将使用领先的跟随量词,谢谢。
猜你喜欢
  • 2013-06-22
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2020-07-23
相关资源
最近更新 更多