Javascript十进制数比较

时间:2018-01-25 20:41:43

标签: javascript node.js

我有两个十进制数字,在最后两位小数处略有不同  例如。 num1 = 1.12345,num2 = 1.1234567 但是执行num1 === num2检查失败。 如果num2中只有少数多余的小数位数与num1相比,那么javascript中最好的方法是使比较返回true?

我知道num2可以通过几个十进制问题进行舍入,但是由于我事先并不知道在num1中会截断多少个小数位,所以会产生问题。

4 个答案:

答案 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)

===的定义不是===的含义,但我认为我得到的是你想做的事。

首先,找出哪个数字最短。 然后,仅将数字与较短数字中的小数位进行比较。

我确信有一种更清洁的方法可以做到这一点,但我已经逐步绘制出来以显示进展并帮助理解这一过程。

&#13;
&#13;
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;
&#13;
&#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上的功能。