Swift的双精度范围



我目前正在编写一个Swift应用程序,其中部分需要确保某些用户输入加起来等于指定值。

一个简化的例子:

通过程序交互,用户指定totalValue = 67,并且该值变为2。这意味着在两个输入中,用户必须提供两个加起来等于67的值。

假设用户在第1轮输入32,然后在第2轮输入35,这是有效的,因为32 + 35 = 67。

这些都可以正常工作,但是当我们接近一个以上的小数点时,程序就不能正确地相加了。例如,如果totalValue = 67,然后在第1轮用户输入66.95,然后在第2轮他输入0.05,程序将返回这是一个错误,尽管事实是66.95 + 0.05 = 67。这个问题不会发生在小数点后1位或更少的情况下(比如第1轮= 55.5和第2轮= 11.5),只会发生在小数点后2位或更大的情况下。我将这些值存储为双精度。提前感谢

一些示例代码:

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
}

如果你想要浮点数的精确值,那么float/double类型将不起作用,因为它们只是精确数字的近象值。在Swift中使用NSDecimalNumber类,我不确定桥接会是什么样子,但它应该很简单。

这是如何工作的一个例子:

var a = 0
for num in numlist {
    a += num
}
var result = false
if a == targetnum
  result = true

我还没有测试过,但如果numlist是一个双精度数组,那么它应该适用于任何有效数字的输入。

我刚刚意识到的一个问题是,用双精度进行等号运算有一个问题,因为四舍五入会给你带来问题。我不打算展示它,但是,如果在读取输入时跟踪小数点右侧有多少个数字,然后将所有值乘以该位数,因此66.95 * 100将其全部作为整数,然后添加,然后进行比较,将目标数乘以相同的值(100)。

不幸的是,没有理想的解决方案。必须使用近似类型比较。

例如,不检查:

if val1 == val2 

我们必须尝试这样做:

if val1 > (val2 - .0005) && val1 < (val2 + .0005)

最新更新