我尝试使用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()
。
答案 0 :(得分:0)
当您使用Int()
时,它会强制截断您的号码,该号码始终向零舍入。因此,6.9999变为6而不是7,因为它接近于零。如果您先使用round()
,则应该有所帮助:
var steps: Int {
return Int(round((max - min) / step) + 1.0)
}
答案 1 :(得分:0)
根据浮点范围计算积分步长总是不好的,你总会遇到问题,而你却无法做很多事情。
相反,我建议在积分步骤上构建逻辑,并根据积分值计算双精度值(反之亦然)。即你不能根据范围计算积分步长,但是你设置了整数步数并计算了你的双步。