我遇到的问题是Javascript在达到0.5时舍入数字的方式.
我正在编写征费计算器,并注意到结果之间存在0.1c的差异.
问题在于它们的结果为21480.705,我的申请将其转换为21480.71,而关税则为21480.70.
这是我用Javascript看到的内容:
(21480.105).toFixed(2)
"21480.10"
(21480.205).toFixed(2)
"21480.21"
(21480.305).toFixed(2)
"21480.31"
(21480.405).toFixed(2)
"21480.40"
(21480.505).toFixed(2)
"21480.51"
(21480.605).toFixed(2)
"21480.60"
(21480.705).toFixed(2)
"21480.71"
(21480.805).toFixed(2)
"21480.81"
(21480.905).toFixed(2)
"21480.90"
问题:
这种不稳定的路由到底是怎么回事?
获得“四舍五入”结果的最快方法是什么(当达到0.5时)?
解决方法:
因此,正如其他一些人已经解释的那样,“不规则”舍入的原因是浮点精度问题.您可以使用JavaScript数字的toExponential()方法进行调查.
(21480.905).toExponential(20)
#>"2.14809049999999988358e+4"
(21480.805).toExponential(20)
#>"2.14808050000000002910e+4"
如您在此处看到的21480.905,它得到的双精度表示形式比21480.905稍小,而21480.805得到的双精度表示形式则稍大于原始值.由于toFixed()方法使用双重表示形式,并且不知道您的原始预期值,因此它会尽一切可能并且应该使用其拥有的信息.
解决此问题的一种方法是,通过乘法将小数点移至所需的小数位数,然后使用标准Math.round(),然后通过除法或乘以反数再次将小数点移回.最后,我们调用toFixed()方法以确保输出值正确地补零.
var x1 = 21480.905;
var x2