JS浮点导致舍入不正确-Math.round()始终有效吗?

问题描述 投票:0回答:2

乘积后,我有一些带有浮点数的情况。

我必须将数字四舍五入到最接近的百位,但是在这种情况下:

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 

有人知道这是否是解决问题的安全方法吗?它总是有效吗?

提前感谢!

javascript floating-point mat
2个回答
2
投票

有人知道这是否是解决问题的安全方法吗?它总是有效吗?

它不安全,并不总是可以工作。

考虑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。


1
投票

四舍五入到最接近的整数可以简单地通过调用

© www.soinside.com 2019 - 2024. All rights reserved.