使用Swift将整数转换为双精度浮点数

11
func avg(numbers: Int...) -> Double {
    var sum = 0;
    var i = 0;
    for number in numbers {
        sum += number;
        ++i;
    }
    return sum / i;
}
avg(42, 597, 12);
< p>该行< code>return sum / i导致错误< code>无法找到接受提供的参数的“/”的重载。 < p>我应该在这里做什么?

6
这些分号看起来太过时了。 - Nate Cook
2
@NateCook,是啊,你可以称呼我为老派。 - Mark Tomlin
3个回答

19

如果你想返回一个Double,你应该在函数中处理Doubles。将sum和i更改为Doubles(0.0 vs 0),并将每个数字转换为double。像这样:

func avg(numbers: Int...) -> Double {
    var sum = 0.0; //now implicitly a double
    var i = 0.0;
    for number in numbers {
        sum += Double(number); //converts number to a double and adds it to sum. 
        ++i;
    }
    return sum / i;
}
avg(42, 597, 12);

整数和浮点数转换

必须显式地进行整数和浮点数之间的转换:

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double

在这里,常量三的值被用于创建一个新的Double类型的值,以便加法的两边具有相同的类型。如果没有进行这种转换,将不允许执行这个加法操作。

对于浮点数到整数的转换也是如此,即可以使用Double或Float值来初始化整数类型:

let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int

在这种方式下,将浮点数值用于初始化新整数值时,它们总是会被截断。这意味着4.75变成4,-3.9变成-3。


1
好的,所以我需要在sum += number中显式地进行类型转换,在使用小数点定义时隐式地进行类型转换。感谢您的提示! - Mark Tomlin
我刚刚看到了Swift编程手册中的这一部分,感觉自己像个白痴。应该再仔细找找。 - Mark Tomlin

13

这是一个改进的答案,利用闭包的友好力量:

func avg(numbers: Int...) -> Double {
    return Double(numbers.reduce(0, +)) / Double(numbers.count)
}

2
炫耀一下!但我喜欢它! :) +1 - Mark Tomlin

10

Swift不会像我们过去所使用的那样,在值类型之间进行隐式转换,因此你的sumi变量的任何乘积都将具有它们自己的类型。你已经让它们隐式地被定义为Int,因此在最终计算时需要强制转换它们的类型,就像这样:

return Double(sum) / Double(i)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接