我目前正在编写一个Swift应用程序,其中的部分内容需要确保某些用户输入符合指定值。
简化示例:
通过程序交互,用户指定totalValue = 67并且转为= 2.这意味着在两个输入中,用户必须提供两个最多相加67的值。
因此,在第1轮,用户输入32,然后在第2轮他输入35,这将是有效的,因为32 + 35 = 67。
这一切都很好,但是当我们进入多个小数位时,程序无法正确添加数字。例如,如果totalValue = 67然后在第1轮用户输入66.95然后在第2轮他输入.05程序将返回这是一个错误,尽管事实是 66.95 + .05 = 67.这个问题不会发生在一个小数位或更小的位置(例如转弯1 = 55.5和转弯2 = 11.5工作正常),仅适用于两个小数点以及更多小数点。我将值存储为双精度数。提前致谢
一些示例代码:
var totalWeights = 67
var input = Double(myTextField.text.bridgeToObjectiveC().doubleValue)
/*Each turn is for a button click*/
/*For turn 1*/
if inputValid == true && turn == 1 && input < totalWeights
{
myArray[0] = input
}
else
{
//show error string
}
/*For turn 2*/
if inputValid == true && turn == 2 && input == (totalWeights - myArray[0])
{
myArray[1] = input
}
else
{
//show error string
}
答案 0 :(得分:3)
如果你想要浮点的精确值,那么float / double类型将不起作用,因为它们只是精确数字的近似值。看看在Swift中使用NSDecimalNumber类,我不确定桥接会是什么样子但它应该很简单。
答案 1 :(得分:1)
以下是一个如何运作的示例:
var a = 0
for num in numlist {
a += num
}
var result = false
if a == targetnum
result = true
我还没有对此进行测试,但如果numlist
是一个double数组,则它应适用于任何有效数字的输入。
我刚刚意识到的一个问题是,做一个与双打相等的问题,因为舍入会给你带来麻烦。我不打算显示它,但是如果在读取输入时你跟踪小数点右边有多少个数字,那么将所有值乘以十进制数,所以66.95 * 100
为将它全部作为整数,然后添加,然后在将targetnum乘以相同的值(100)之后进行比较。
答案 2 :(得分:0)
不幸的是,没有理想的解决方案。我们必须使用近似类型比较。
例如,而不是检查:
if val1 == val2
我们必须尝试类似的事情:
if val1 > (val2 - .0005) && val1 < (val2 + .0005)