This question already has answers here:
Is floating point math broken?
(31个答案)
去年关闭。
这是功能:
当我在此功能中使用
当数字为
并且当数字为
为什么我得到这些未取整的数字以及如何修改
更新:我尝试了其他链接的解决方案。像这个:
我仍然得到类似
四舍五入是可行的,但是一旦您执行更多的算术运算(即
最好将Fixed作为最后一步应用,因此您可以在操作过程中保持精度,而在保留舍入时仅在最后丢失精度,例如
使用
(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.8
和1
?更新:我尝试了其他链接的解决方案。像这个:
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