以0.1为步长验证HTML5数字输入

时间:2012-10-15 15:52:24

标签: php html5 floating-point validation

尝试进行服务器端验证(PHP),其中有HTM5号码输入:

<input ... min="1" max="20" step="0.1" />

浏览器允许您输入诸如“10.5”之类的值,但是如何在PHP中对其进行双重检查?对于那些不会进行验证的浏览器(以及您不应该信任浏览器数据的事实)。

if (fmod(floatval($value), 0.1) == 0) {
    // valid
}

这不起作用,因为在这种情况下fmod()返回“0.099999 ...”,按照:

Why different results of 0.5 mod 0.1 in different programming languages?

你可以将$值乘以10,并使用1的模数检查(而不是0.1),这样你就可以进行整数数学...但如果步长是0.01或0.003会怎样?

1 个答案:

答案 0 :(得分:1)

如果数字将作为浮动存储在引擎盖下方,它将始终四舍五入到最接近的可表示数字。

您可以接受值为float,只需按以下方式进行检查:

// get the nearest multiple of $step that is representable in float
$normalized = round($number, $allowed_digits); // for steps like '0.1', '0.01' only
$normalized = round($number / $step) * $step;  // works for any arbitrary step, like 0.2 or 0.3

// verify if they are not too different, where EPSILON is a very small constant
// we cannot directly == as the calculations can introduce minuscule errors
if (abs($normalized - $number) > EPSILON)
   die("Did not validate.");

或者,您可以简单地将客户端的值视为字符串,并验证字符串中使用的位数(稍后转换为float)。如果你想100%确定用户输入的内容是0.01,而不是0.099999999999(这将与0.01相同),你应该这样做。