Javascript浮动比较

Ale*_*rez 22 javascript floating-point comparison numbers

我在javascript中的数字比较存在很大问题.

该脚本指责比较"7 <10"是错误的.

console.clear();

var min = parseFloat("5").toFixed(2);
var max = parseFloat("10").toFixed(2);
var value = parseFloat("7").toFixed(2);

console.log(min, max, value);

console.log(value > min); // OK.
console.log(value < max); // ---- false ??????
Run Code Online (Sandbox Code Playgroud)

有谁知道什么是happing?

pro*_*ype 40

事实证明.toFixed()返回字符串 - 尝试在比较值之前添加parseFloat以查看结果:

console.log(parseFloat(value) < parseFloat(max)); // ---- now true
Run Code Online (Sandbox Code Playgroud)


Luk*_*kas 6

您应该始终舍入浮点数,否则在某些情况下会得到怪异的结果。

试试看这个问题: console.log(parseFloat(6760/100*100));

通过四舍五入,您将获得正确的结果:

console.log(Math.round(parseFloat(value)*100000) < Math.round(parseFloat(max)*100000));
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试使用类似以下内容的方法:http : //mikemcl.github.io/decimal.js/

浮点数不是准确的数字,它们是数字的近似表示。

实际上很简单。当您拥有以10为底的系统(如我们的系统)时,它只能表示使用底的素数的分数。10的素数是2和5。因此,由于分母都使用10的素数,所以1 / 2、1 / 4、1 / 5、1 / 8和1/10都可以清楚地表达。 / 3、1 / 6和1/7都是重复的小数,因为它们的分母使用3或7的质数。在二进制(或基数2)中,唯一的质数是2。因此,您只能清楚地表达小数仅包含2作为主要因子。以二进制形式,1 / 2、1 / 4、1 / 8都将干净地表示为小数。而1/​​5或1/10将重复小数。因此,在以10为基数的系统中使用干净的小数时,0.1和0.2(1/10和1/5)在计算机运行的以2为基数的系统中重复小数。 资源


不是JavaScript的问题。发生这种情况是因为计算机实际上只能识别1和0。

如果您想深入了解该主题,建议您以此为起点:https : //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html