快速划分双打时精度损失

时间:2015-12-14 11:08:10

标签: swift

我尝试使用swift 2.1找到给定步长的最小值和最大值之间的步骤。

所以我们有一个min和max值,都是Double类型。步长也是双倍。如果min为0.0且最大值为0.5,步长为0.1,则结果显示为6。

但是如果我以-0.1作为最小值开始,结果也是6。但应该是7,同意吗?

这是我的Playground示例:

let min:Double = -0.1
let max:Double = 0.5

let step:Double = 0.1

var steps: Int {
    return Int((max - min) / step) + 1
}

print("steps: \(steps)") // returns "steps: 6", but should be 7

如果我们对步骤变量使用Double,则结果为6.99999999。但这种精度损失只发生在我们的最小值为负值时。

你知道一个解决方法吗?我每次用双打计算时都不想round()

2 个答案:

答案 0 :(得分:0)

当您使用Int()时,它会强制截断您的号码,该号码始终向零舍入。因此,6.9999变为6而不是7,因为它接近于零。如果您先使用round(),则应该有所帮助:

var steps: Int {
    return Int(round((max - min) / step) + 1.0)
}

答案 1 :(得分:0)

根据浮点范围计算积分步长总是不好的,你总会遇到问题,而你却无法做很多事情。

相反,我建议在积分步骤上构建逻辑,并根据积分值计算双精度值(反之亦然)。即你不能根据范围计算积分步长,但是你设置了整数步数并计算了你的双步。