我正在学习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);
}
答案 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">