我有两个输入#input_a和#input_b with decimal:
<input id="input_a" name="input_a" step="any" type="number">
<input id="input_b" name="input_b" step="any" type="number">
<a href="javascript:checkForm();">Save</a>
和js:
function checkForm(i){
var a = $('input#input_a').val().replace(',','.');
var b = $('input#input_b').val().replace(',','.');
var send = true;
if(parseFloat(a) % parseFloat(b) != 0){
$('#formerror).html('Invalid');
send = false;
}
if(send==true) {
$('#form').submit();
}
}
但是例如对于值input_a = 2,input_b = 0.1
parseFloat(a) % parseFloat(b) = 0.09999999999
并给我一个错误。如何做到这一点?
答案 0 :(得分:1)
JavaScript使用binary floating point数字表示。因此,内部表示0.1
只是十进制值的近似值。这与0.1 + 0.2
产生0.30000000000000004
的原因相同。
因此,虽然2可以被0.1整除,但不能完全可以被0.1
的运行时内部逼近整除。
解决这个问题的一种方法是检查非常接近的除数,而不是完美的除数:
// note +value is shorthand for parseFloat(value)
var a = +$('input#input_a').val().replace(',','.'),
b = +$('input#input_b').val().replace(',','.'),
epsilon = 1e-10, // some very small value
mod = a % b;
if(mod < epsilon || b - mod < epsilon){
$('#form').submit();
} else {
$('#formerror).html('Invalid');
}
答案 1 :(得分:0)
https://stackoverflow.com/a/2925496/2956903
它实际上适用于C#,但我认为同样适用于您的示例。
所以答案是: