为什么下面的圆函数不能舍入一些数值?

时间:2018-01-19 03:12:42

标签: javascript math

这是功能:

export const round = (value, precision) => {
  const multiplier = Math.pow(10, precision || 0)
  return Math.round(value * multiplier) / multiplier
}

在此功能中使用round时:

SET_CAMERA_ZOOM (state, number = 0) {
  // the default is 1.4
  const cameraZoom = state.markerEditor.cameraZoom
  const roundedCameraZoom = round(cameraZoom, 1)
  state.markerEditor.cameraZoom = roundedCameraZoom + number
}

我在号码为0.4时得到:

1.4
1.7999999999999998
1.8
2.2
2.6
3

当号码为-0.4时(从3开始):

2.6
2.2
1.8000000000000003
1.8
1.4
0.9999999999999999

为什么我会收到这些未提及的号码以及如何修改round,以便我得到1.81

更新:我尝试过其他链接的解决方案。像这样:

precision = precision || 0
return parseFloat(parseFloat(number).toFixed(precision))

我仍然得到像0.9999999999999999这样的内容。

2 个答案:

答案 0 :(得分:4)

您获得1.7999999999999998等数字的原因是因为javascript数字的精确度有限(请参阅Is floating point math broken?

因此,当您使用分数执行操作时,您会得到如下结果:



function round (value, precision) {
  var multiplier = Math.pow(10, precision || 0);
  return Math.round(value * multiplier) / multiplier
}

for (var i=1, x=-.4; i<5; i++) console.log(round(x*i, 1) + 1);
&#13;
&#13;
&#13;

舍入有效,但只要您执行更多算术运算(即+ 1),您就会以有限的精度重新回到问题中。

最后一步应用 toFixed 要好得多,因此在操作过程中保持精确度,并且在保持舍入的同时只丢失它,例如。

&#13;
&#13;
// Do arithmetic, then round as very last operation
for (var i=1, x=-.4; i<5; i++) console.log(Number((x * i + 1).toFixed(1)));
&#13;
&#13;
&#13;

使用Number(...)转换为最后的数字以显示精度和舍入。

答案 1 :(得分:3)

问题可能在于你的上一个陈述

return Math.round(value * multiplier) / multiplier

你可能想要这个

return Math.round((value * multiplier) / multiplier)

或者你想要这个

return Math.round(value * 10 ) / 10 // multiply by 10, round , divide
//by 10

你除以一个在javascript中不同于整数的数字,所以除非你舍入整个值,否则你可能不会得到一个整数。在Java中,如果执行整数除法,它会自动截断一个导致精度损失的值,但javaScript不是Java,因此要获得所需的行为,需要在适当的位置进行舍入或使用乘法然后除行为以截断值。 这是一个链接,可帮助您了解Java和javaScript算术运算之间的差异https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators