为什么JavaScript似乎返回的模数不一致?

时间:2019-06-01 16:04:05

标签: javascript

我正在学习JavaScript,并且有一个页面显示显示两个用户输入数字相除的结果。

我不喜欢(1 / 3)3.333333333333...填充整个结果框,所以我用.toFixed(4)设置结果。但这会导致(4 / 2)返回2.0000而不是2的结果。

因此,为了解决此问题,我检查了(answer % 1 == 0)(在这种情况下它正常显示答案),然后检查了(answer % 0.1 == 0),它显示了answer.toFixed(1),依此类推,最终else.toFixed(4)

这对于某些数字而言是预期的,但对于其他一些数字而言则并非如此,在这种情况下,我不明白为什么或出了什么问题。

示例:

  • (2 / 5)返回0.4。这满足第二个条件(answer % 0.1 == 0),并返回answer.toFixed(1),显示0.4。很好。

  • (2 / 10)也可以工作并显示0.2,并且类似(2 / 7)之类的东西会正确推入else并显示0.2857

  • (2 / 8)返回0.25,然后错误地显示0.2500

  • (2 / 20)正确返回并显示0.1

  • (9 / 6)返回1.5,然后错误地显示1.5000

  • (2 / 4)返回0.5,但显示0.5000。它无法满足所有条件,并跳转到else语句,因此使用了answer.toFixed(4)

为什么JavaScript会认为(0.4 % 0.1 == 0)true,而(0.5 % 0.1 == 0)false

这是我当前的代码:

let num1 = parseFloat($("calcInput1").value);
let num2 = parseFloat($("calcInput2").value);
answer = num1 / num2;

if (answer % 1 == 0) {
    document.getElementById("calcResult").value = answer;
    alert("answer % 1 == 0");
} else if (answer % 0.1 == 0) {
    document.getElementById("calcResult").value = answer.toFixed(1);
    alert("answer % 0.1 == 0");
} else if (answer % 0.01 == 0) {
    document.getElementById("calcResult").value = answer.toFixed(2);
    alert("answer % 0.01 == 0");
} else if (answer % 0.001 == 0) {
    document.getElementById("calcResult").value = answer.toFixed(3);
    alert("else");
} else {
    document.getElementById("calcResult").value = answer.toFixed(4);
}  

1 个答案:

答案 0 :(得分:1)

我相信,您需要使用以下方法实现输出:

var answer = +(num1 / num2).toFixed(4);

将用string生成的toFixed()投射回number可以帮助避免最后出现冗余零。另外,您根本不需要使用modulus运算符,也不需要面对与浮点算术精度有关的问题。

请注意,我已经使用unary plus将字符串转换回数字,如MDN上所述:

  

一元加号是将某物转换为数字的最快且首选的方式。

示例:

var button = document.getElementById("calc");
var in1 = document.getElementById("calcInput1");
var in2 = document.getElementById("calcInput2");
var out = document.getElementById("answer");

button.addEventListener("click", function()
{
    var num1 = in1.value, num2 = in2.value;
    var answer = +(num1 / num2).toFixed(4);
    out.value = answer;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" id="calcInput1">
<input type="text" id="calcInput2">
<button type="button" id="calc">Calc</button>
<input type="text" id="answer">