This question already has answers here:
Is floating point math broken?
                                
                                    (31个答案)
                                
                        
                                去年关闭。
            
                    
这是功能:

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之类的东西。

最佳答案

之所以会得到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);





四舍五入是可行的,但是一旦您执行更多的算术运算(即+ 1),您就会以有限的精度返回到该问题。

最好将Fixed作为最后一步应用,因此您可以在操作过程中保持精度,而在保留舍入时仅在最后丢失精度,例如



// 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)));





使用Number(...)会在最后转换为数字以显示精度并保留舍入。

关于javascript - 为什么以下舍入函数不舍入一些数值? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48333582/

10-16 14:12