在Swift中,除法运算不正常工作。

3
这是我的代码:

println(Double(2/5))

当我运行这段代码时,它会打印出以下内容:
0.0

我该怎么解决这个问题?我希望结果显示为0.4。是四舍五入出了问题吗?
3个回答

9
问题在于你直到两个整数进行整数除法后才转换为Double。让我们看一下运算顺序。我们从内部开始向外移动。
  • 在整数2和整数5之间执行整数除法,得到整数0
  • 从整数0创建一个Double,得到0.0
  • 调用双倍0.0上的description,返回字符串"0.0"
  • 在字符串"0.0"上调用println

我们可以通过在除法之前在每个侧面调用Double构造函数来解决这个问题。
println((Double(2)/Double(5)))

现在操作的顺序如下:
  • 将整数2转换为浮点数2.0
  • 将整数5转换为浮点数5.0
  • 对这些浮点数执行浮点除法,得到0.4
  • 在浮点数0.4上调用description,返回字符串"0.4"
  • 在字符串"0.4"上调用println

请注意,并不严格需要将除法的两边都转换为Double类型。

只要我们正在处理字面值,就可以直接写成println(2.0/5.0)

我们还可以写成println((2 * 1.0)/5),这会把所有的字面值解释为浮点数(因为我们已经将其乘以浮点数)。

只要运算的一侧是浮点数类型,Swift 就会将整数字面值解释为浮点数类型。但我认为最好明确地转换我们的类型,这样我们就可以清楚地说明我们想要发生什么。因此,让我们将所有的数字都放入相同的类型中,并明确地说明我们想要什么。


如果我们正在处理字面值,我们可以添加.0来将它们强制转换为浮点数:

println(2.0/5.0)

如果我们要处理变量,可以使用构造函数:

let myTwoInt: Int = 2
let myFiveInt: Int = 5

println((Double(myTwoInt)/Double(myFiveInt))

3
我认为您的问题在于您正在除以两个整数,这通常会返回一个整数。我在Java中遇到过类似的问题,将.0添加到其中一个整数或使用double函数将任一整数转换为双精度浮点数应该可以解决此问题。
这是类型化语言的一个特性,它创建与被除数相同类型的结果。

2
Digits的看法是正确的;与你采取的方法不同,试试这个方法:
print(2.0 / 5.0)

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