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)
您应该始终舍入浮点数,否则在某些情况下会得到怪异的结果。
试试看这个问题: 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
| 归档时间: |
|
| 查看次数: |
43772 次 |
| 最近记录: |