Javascript:Math.round对于特定数字无法正常工作

Javascript:Math.round对于特定数字无法正常工作,javascript,Javascript,在使用javascript舍入值的过程中,我遇到了一个奇怪的问题。某些值的舍入格式不正确 var n =17.955 ; var roundedPrice; roundedPrice = Math.round(n*100)/100; console.log(roundedPrice); // It returns 17.95 instead of 17.96 对于某些特定值,如16.955、17.955、18.955、19.955,会发生这种情况。除了这些值,如1.955、12.955、20.

在使用javascript舍入值的过程中,我遇到了一个奇怪的问题。某些值的舍入格式不正确

var n =17.955 ;
var roundedPrice;
roundedPrice = Math.round(n*100)/100;
console.log(roundedPrice); // It returns 17.95 instead of 17.96
对于某些特定值,如
16.955、17.955、18.955、19.955
,会发生这种情况。除了这些值,如
1.955、12.955、20.955、27.955…
此轮函数返回正确的值


已编辑:仅17.955版本。这将返回17.9555(3乘以5)的正确结果。


提前感谢。

您可以使用
Math.ceil()
获得预期结果。

这是重复的。这与浮点值的二进制表示的不精确性有关。请注意,这是几乎所有编程语言(不仅仅是JavaScript)中的数字都存在的问题。问题从n*100开始,它返回一个不稳定的浮点值,以.4999999999结尾,您希望它是一个实数。5它仅在17.955中出现。这将返回17.9555(3乘以5)的正确结果@FreemanLambda:是的,你是对的。但这只发生在
17.955和17.455上。例如,如果运行
17.355*100
,它将返回
1735.5
I已使用
var a=n*100修复了我的问题;roundedPrice=Math.round(a.toPrecision(10))/100
。感谢大家的帮助。如何判断何时使用
ceil
何时使用
floor
?这取决于您的要求,您到底想要什么,ceil还是floor。OP似乎希望使用精确的数学方法来实现。您建议他使用
ceil
。这会有什么帮助?@Pritom-Yury-Tarabanko正试图温和地引导你明白为什么你的答案是错误的。我更直截了当。您的答案是错误的:OP的问题与以2的补码二进制格式表示任意浮点数的固有不精确性有关。它与在
轮上拾取
天花板
地板
无关。在发布答案之前,你应该从阅读链接dupe中找出答案。这并不能确保一个人总是给出正确的答案,但这并不意味着你必须投反对票,我们的心态不同。