首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入基础更改算术运算符的行为

导入基础更改算术运算符的行为
EN

Stack Overflow用户
提问于 2014-08-09 02:39:14
回答 3查看 97关注 0票数 3
代码语言:javascript
复制
Welcome to Swift!  Type :help for assistance.
   1> 1 / 3.0
$R0: Double = 0.33333333333333331
   2> 1 % 3
$R1: Int = 1
   3> 1 % 3 / 3.0
$R2: Double = 0.33333333333333331

   4> import Foundation
   5> 1 / 3.0
$R3: Double = 0.33333333333333331
   6> 1 % 3
$R4: Int = 1
   7> 1 % 3 / 3.0
$R5: Int = 0    // this result changes after importing Foundation

这是一个bug还是Swift中的某种隐式转换魔法?

编辑

重现此问题的另一种(更简单)方法:

代码语言:javascript
复制
  1> 1.0 / 3
$R0: Double = 0.33333333333333331
  2> import Foundation
  3> 1.0 / 3
$R1: Int = 0
  4> Double(1.0) / 3    // this is a workaround
$R2: Double = 0.33333333333333331

我可以在iOS应用程序中重现此问题,而不仅仅是在REPL中。我使用的是xcode6-beta5。

EN

回答 3

Stack Overflow用户

发布于 2014-08-09 03:10:32

如果没有Foundation,这两个表达式将返回不同的类型:

代码语言:javascript
复制
1 % 3 / 3     // 0 : Int
1 % 3 / 3.0   // 0.33333333333 : Double

这与Swift一书中定义的行为一致:

“如果在表达式中组合了整型和浮点型文字,则会从上下文中推断出一种双精度类型:”

对于Foundation,这两个表达式都返回一个Integer:

代码语言:javascript
复制
1 % 3 / 3     // 0 : Int
1 % 3 / 3.0   // 0 : Int

经过调查,我在Foundation中看不到任何明显的会导致这种情况的东西--没有为%或/定义奇怪的运算符来实现这一点,而且优先级似乎是相同的。不仅如此,我还不能在操场或REPL之外重现这种行为。如果您在一个简单的控制台应用程序中执行上述操作,那么即使您导入Foundation,也会看到预期的结果(0.333333333333333: Double)。

正如Zaph所说,这几乎可以肯定是一个bug。我会上报的。

票数 1
EN

Stack Overflow用户

发布于 2014-08-09 03:06:35

我在操场上玩耍,试图复制你的问题,但做不到。我试过了..。

代码语言:javascript
复制
let r7 = 1 % 3 / 3.0 //evaluates to 0.333333

import Foundation

let r8 = 1 % 3 / 3.0 //evaluates to 0.333333

我认为您看到的可能是将RHS分配给LHS上的显式类型Double和Int类型变量的不同之处。所以..。

代码语言:javascript
复制
let r5:Double = 1 % 3 / 3.0 //evaluates to 0.33333
let r6:Int = 1 % 3 / 3.0 //evaluates to 0

我发现这个数学表达式对不同的读者来说也有些模棱两可。将其重写为(1%3)/3.0可能是明智的(如果这实际上是您的意思!!这就是计算机所看到的)。当然,1%3的结果是整数1,整数1除以Double 3.0等于0.33333。所以我觉得你的问题可以简化为...

代码语言:javascript
复制
let r5:Double = 0.3333333 //evaluates to 0.33333
let r6:Int = 0.3333333 //evaluates to 0

这与算术没有太大关系,只是Int和Double类型的区别。

票数 0
EN

Stack Overflow用户

发布于 2014-08-09 03:34:02

答案是Swift失败了,毕竟它是Beta版的。我向苹果公司提交了错误报告,雷达: 17962491。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25210151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档