当前位置: 首页 > 面试题库 >

奇怪的Swift数字类型转换

石苏燕
2023-03-14
问题内容

我刚刚注意到,Swift在Int和Double上做了一些类型转换。当我尝试评估

(10 / 3.0) - (10 / 3)

0.333...是预期的,但实际上是0.0。有人可以解释一下吗?


问题答案:

是的,我也发现这很令人惊讶。Double同时符合FloatLiteralConvertibleand
IntegerLiteralConvertibleExpressibleByFloatLiteralExpressibleByIntegerLiteralSwift
3)。因此,Double可以使用 浮点文字 初始化a __

let a = 3.0

或使用 整数文字

let b : Double = 10

(对于其他浮点类型(例如FloatCGFloat)也是如此。)

现在,对于我们所有人而言,(客观)C背景这两个语句可能都出乎了意料之外

let x : Double = 10/4     // x = 2.5 .  Really? Yes!
let y = 10/4 as Double    // Same here ...

将值分配给0.25变量。从上下文来看,除法的结果必须为a,Double并且Swift不会隐式转换类型。因此/ 必须 是浮点除法运算符

func /(lhs: Double, rhs: Double) -> Double

因此,编译器会Double根据文字“ 10”和“
4”将两个参数都创建为s。(如果将10/4其视为两个整数的除法,则结果也将是一个整数,并且无法将其分配给Double。)

请注意,这与

let z = Double(10/4)   // z = 2.0 . (I just thought that I understood it &%$!?)

进行整数除法并将结果转换为DoubleDouble有一个init(_ v: Int)构造函数,并且因此10/4 可以
被视为此处两个整数的分频。

如果我们总结一下这些结果,确实看起来有点奇怪:

let x : Double = 10/4     // x = 2.5 
let y = 10/4 as Double    // y = 2.5
let z = Double(10/4)      // z = 2.0

现在我们可以将这些结果应用于您的表情

(10 / 3.0) - (10 / 3)

第一部分(10 / 3.0)只能是a Double,因此- 必须是浮点减法运算符

func -(lhs: Double, rhs: Double) -> Double

因此(10 / 3)也必须是一个Double。同样,/必须是浮点除法运算符,因此103被视为Double常量

因此表达式等于

(Double(10) / 3.0) - (Double(10) / Double(3))

并计算为0.0。如果将表达式更改为

(10 / 3.0) - Double(10 / 3)

那么结果是0.333...因为在这种情况下10 / 3 是两个整数常数的除法,如上所述。



 类似资料:
  • 问题内容: 有没有人看到像这样的方法签名后放置的数组? 版画 过去,“ C”兼容性是一种奇怪的表示法,但我也无法想象有人用C编写这种代码。 有谁知道为什么甚至允许这样做? 如果有问题,我正在使用Java 7 update 10。 这与Java 6中的功能相同。http://ideone.com/91rZV1 顺便说一句,这不会编译,我也不希望它编译 问题答案: 有谁知道为什么甚至允许这样做? 在这

  • 我使用的是Java8。 我最近遇到了这个问题: 这不会抛出java.lang.ClassCastException,为什么呢? 我总是想<code>和<code>System.out。println调用。但当我尝试这样做时,它会像预期的那样抛出异常。

  • 问题内容: 今天在与Swift交往时,我遇到了一件奇怪的事情。这是我开发的单元测试,显示了使用Swift的AnyObject时的一些意外行为。 这段代码简化了一些其他代码,其中只有一个Swift函数只能返回。 不出所料,在创建的实例之后,将其强制转换为并设置另一个变量,由于没有这样的属性,因此无法编译该属性。 但令人惊讶的是,编译器接受了一个名为的属性,因为on上有该名称的属性。看起来,只要它在运

  • 主要内容:定义类层次结构,类型检查,向下转换在Swift 4语言中类型转换用于检查实例类型是属于特定的超类还是子类,还是在自己的层次结构中定义。 Swift 4类型转换提供两个运算符和来检查值的类型,并将类型值转换为不同的类型。 类型转换还检查实例类型是否遵循特定的协议一致性标准。 定义类层次结构 类型转换用于检查实例的类型,以确定它是否属于特定的类类型。 此外,它还检查类及其子类的层次结构,以检查并转换这些实例,使其成为同一层次结构。 当

  • Swift 语言类型转换可以判断实例的类型。也可以用于检测实例类型是否属于其父类或者子类的实例。 Swift 中类型转换使用 is 和 as 操作符实现,is 用于检测值的类型,as 用于转换类型。 类型转换也可以用来检查一个类是否实现了某个协议。 定义一个类层次 以下定义了三个类:Subjects、Chemistry、Maths,Chemistry 和 Maths 继承了 Subjects。 代

  • 问题内容: 我已经将其输入python shell: 我期望0.1 * 0.1不是0.01,因为我知道以10为底的0.1是周期性的,以2为底。 我已经看过20个以上的字符,因此我希望能得到20个。为什么我得到4? 好吧,这解释了为什么我给了我4,但为什么回归? 为什么不回合?(我已经阅读了这个答案,但是我想知道他们如何决定何时对浮点数进行取整,以及何时对不进行浮点取整) 因此,浮子的准确性似乎是一