我有两个十进制数字,在最后两位小数处略有不同 例如。 num1 = 1.12345,num2 = 1.1234567 但是执行num1 === num2检查失败。 如果num2中只有少数多余的小数位数与num1相比,那么javascript中最好的方法是使比较返回true?
我知道num2可以通过几个十进制问题进行舍入,但是由于我事先并不知道在num1中会截断多少个小数位,所以会产生问题。
答案 0 :(得分:0)
有两种可能的方法(我知道)。第一个是使用toFixed,来舍入你的数字。第二个是提出一些精确因子,以便定义“略微”(让我们说略微意味着“差异小于0.0001”)。实现它的功能在
下面// a, b - the numbers you wish to compare, digits - the number of digits to round to
function compareUpTo(a, b, digits){
a.toFixed(digits) === b.toFixed(digits) // first we round the numbers, then we compare them
}
// a, b - the numbers you wish to compare, precision- the amount to which the numbers are allowed to be different (let's say 0.01 for up to two digits)
function compareUpTo2(a, b, precision){
Math.abs(a-b) < precision // we make the difference and check whether or not the difference is smaller than our desired precision (we use Math.abs to turn a negative difference into a positive one)
}
答案 1 :(得分:0)
您可以使用toString并比较字符串。这将解决事先不知道数字的问题。
num1 = 1.12345 ;
num2 = 1.1234567 ;
str1 = num1.toString();
str2= num2.toString();
leng1 =str1.length;
leng2=str2.length;
minLength = Math.min(leng1 ,leng2);//ignore extra decimals
str1 =str1.slice(0,minLength);
str2 =str2.slice(0,minLength);
console.log(str1 ===str2); //true
答案 2 :(得分:0)
===
的定义不是===
的含义,但我认为我得到的是你想做的事。
首先,找出哪个数字最短。 然后,仅将数字与较短数字中的小数位进行比较。
我确信有一种更清洁的方法可以做到这一点,但我已经逐步绘制出来以显示进展并帮助理解这一过程。
function compare(x, y){
// Convert both numbers to strings:
var str1 = x.toString();
var str2 = y.toString();
// Get the shortest string
var shortest = str1.length >= str2.length ? str2 : str1;
console.log("Shorter number is: " + shortest); // Just for testing
// Get number of decimals in shorter string
var dec = shortest.indexOf(".");
var numDecimals = shortest.length - dec - 1;
// Only compare up to the least amount of decimals
console.log(x + " and " + y + " equal? " + (str1.substr(0, numDecimals + dec + 1) === str2.substr(0, numDecimals + dec + 1)));
}
compare(1.12345, 1.1234567);
compare(1.22345, 1.1234567);
compare(-101.22345, -101.1234567);
compare(-101.12345, -101.1234567);
&#13;
答案 3 :(得分:0)
我这样做的方法是找到&#34;更短的&#34;数字,然后截断&#34;更长的&#34;来自MDN的代码编号:
function truncate(number, precision) {
var factor = Math.pow(10, precision);
// *shouldn't* introduce rounding errors
return Math.floor(number * factor) / factor;
}
精度是较短数字的长度。哪个,你可以这样:
let num1 = 1.12345,
num2 = 1.1234567;
// gets everything after the . as a string
let str1 = String.prototype.split.call(num1,'.')[1],
str2 = String.prototype.split.call(num2,'.')[1];
let precision = Math.min(str1.length, str2.length);
然后,在两个数字上调用上述函数并进行比较。
if(truncate(num1,precision) == truncate(num2,precision) //do stuff
我为此答案修改了Math.round() page from MDN上的功能。