【问题标题】:How to get modulo from floats?如何从浮点数中获得模数?
【发布时间】:2014-11-08 08:33:35
【问题描述】:

我有两个输入 #input_a 和 #input_b 带十进制:

<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.09...9)?

标签: javascript


【解决方案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');
}

【讨论】:

    【解决方案2】:

    看看这个答案:

    https://stackoverflow.com/a/2925496/2956903

    它实际上适用于 C#,但我认为这同样适用于您的示例。

    所以答案是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多