这是功能:
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
这样的内容。
答案 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;
舍入有效,但只要您执行更多算术运算(即+ 1
),您就会以有限的精度重新回到问题中。
最后一步应用 toFixed 要好得多,因此在操作过程中保持精确度,并且在保持舍入的同时只丢失它,例如。
// 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;
使用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