乘积后,我有一些带有浮点数的情况。
我必须将数字四舍五入到最接近的百位,但是在这种情况下:
115000*4.35 //500249.99999999994
我会得到错误的结果:
Math.round(115000*4.35 / 100) * 100 //500200
而不是500300
解决方案:
第一次舍入到最接近的小数点后一位:
Math.round(500249.99999999994 * 10) / 10 //200250,
然后四舍五入到最接近的百位数:
Math.round(500250 / 100) * 100 //200300
组合:
Math.round(Math.round(num * 10) / 1000) * 100
有人知道这是否是解决问题的安全方法吗?它总是有效吗?
提前感谢!
有人知道这是否是解决问题的安全方法吗?它总是有效吗?
它不安全,并不总是可以工作。
考虑100,005•9.99。在实际算术中,这是999,049.95,您显然希望将其舍入到最接近的100的倍数,从而产生999,000。
9.99无法存储在JavaScript编号中。最接近的可表示值是9.9900000000000002131628207280300557613372802734375。用JavaScript的浮点算术乘以100.005,得出999,049.950000000069849193096160888671875。
您提出的解决方案首先尝试将其舍入为最接近的1/10的倍数。在这种情况下,它成功了,产生999,050。 (在许多情况下,这失败了,因为可以表示的1/10的唯一倍数是5/10的倍数。)然后使用Math.round(999050 / 100) * 100)
得出999,100(因为Math.round
将一半的情况向上舍入)。 >
即使使用实数算术,而不是浮点算术,您提出的解决方案也不起作用。使用相同的方法将999,049.95舍入到最接近的1/10的倍数(加半数情况下),得出999,050,将其舍入到最接近的100的整数倍,得到999,100。
四舍五入到最接近的整数可以简单地通过调用