JavaScript中的浮点运算精度能达到100%吗?
浮点数
带小数点的正数或负数整数称为浮点数。例如,1.52、0.14和-98.345都是浮点数。而77、56、90和0则不是浮点数。
在JavaScript中,这种格式将数字存储在64位中。分数存储在第0到51位。指数存储在第52到62位。符号位存储在第63位。
浮点运算
JavaScript中的浮点运算永远不可能达到100%的精确度。例如,分数1/6,即0.16666……,在某个点上会进行四舍五入。如果我们尝试向上述值添加另一个小数值,我们可能无法得到预期的结果,因为两个小数值相加时肯定会产生舍入误差。这些舍入误差通常很小,不会影响代码的输出。
示例1
在下面的示例中,我们尝试添加两个小数值0.2和0.4。通常的输出是0.6。但是,由于舍入误差,期望的输出与实际输出不同。
<html> <head> <title>Rounding Errors</title> </head> <body> <h3 id=heading></h3> <h3>Thus, Floating point arithmetic will not show 100% accuracy in JavaScript.</h3> <script> let f_p_a = 0.2 + 0.4; document.getElementById("heading").innerHTML = "0.2 + 0.4 = " + f_p_a; </script> </body> </html>
示例2
下面的示例包含一个小数值和一个非小数值,分别为2.14和2。由于舍入误差,实际输出将与期望输出不同。
<html> <head> <title>Rounding Errors</title> </head> <body> <h3 id=heading></h3> <h3>Thus, Floating point arithmetic will not show 100% accuracy in JavaScript.</h3> <script> let a = 2.14; let b = 2; let c = a + b; document.getElementById("heading").innerHTML = "2.14 + 2 = " + c; </script> </body> </html>
示例3
在下面的示例中,我们尝试对一个小数值和一个非小数值进行求和。这个非小数值有16位,因为整数的精度最多到15位。这里我们最终得到的输出也包含舍入误差。
<html> <head> <title>Rounding Errors</title> </head> <body> <h4 id=heading></h4> <p>Integers will be accurate till they are upto 15 digits.</p> <p>Thus, Floating point arithmetic will not show 100% accuracy in JavaScript.</p> <script> var a = 2.14; var b = 9999999999999999; /*It will be 10000000000000000 (1e+16) at the time of execution */ var c = a + b; document.getElementById("heading").innerHTML = " 2.14 + 9999999999999999 = " + c; </script> </body> </html>
示例4
在下面的示例中,我们进行了两个操作。第一个是舍入误差,第二个是校正因子。
要使用校正因子,我们需要用合适的10的幂进行乘法,以便在整数之间进行运算。
考虑下面的示例值0.1和0.2,校正因子为10。我们进行了校正。
<!DOCTYPE html> <html> <title>Online Javascript Editor</title> <head> <script> function test() { let a = 0.1; let b = 0.2; let c = a*b; document.write("Rounding error: "); document.write(c, "<br>"); let x = 10; let cf = (a * x) * (b * x) / (x * x); document.write("After using correction factor: "); document.write(cf); } test(); </script> </head> <body> </body> </html>
广告