如何从浮点数获得模数?

时间:2014-11-07 23:04:42

标签: javascript

我有两个输入#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

并给我一个错误。如何做到这一点?

2 个答案:

答案 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#,但我认为同样适用于您的示例。

所以答案是:

没有错误。浮点运算只是不能提供更高的精度。