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

将NSNumber强制转换为Float时发生意外行为

瞿子濯
2023-03-14
问题内容

升级到Xcode
9.3(9E145)后,我的应用程序显示了一些意外行为。看来问题在于将NSNumber强制转换为Float。我as为此使用类型强制转换运算符。请参见以下示例。

let n = NSNumber.init(value: 1.12)
let m = NSNumber.init(value: 1.00)

let x = n as? Float
let y = m as? Float

let xd = n as? Double

let z = Float(truncating: n)

在此,第一次强制转换失败,即x == nil。第二次强制转换成功,并且使用init:truncating构造函数实例化Float 也成功,即z == 1.12。从n到Double的转换成功,对我而言,这毫无意义。

谁能向我解释这种行为?即是谁能给我一个很好的理由,说明为什么将n强制转换为Float?这是一个错误吗?如果这是预期的行为,那么您可以参考Swift文档中描述此位置的位置吗?


问题答案:

这是在Swift 4中实现的SE-0170 NSNumber桥接和数字类型的结果:

as?for NSNumber应该表示“我可以安全地将存储在不透明框中的称为NSNumber的值表示为所需的值吗?”。

1.12是一个浮点文字,并推断为a Double,因此NSNumber(value: 1.12)对最接近的64位浮点值进行“装箱”
1.12。将其转换为32位Float不会保留此值:

let n = NSNumber(value: 1.12)
let x = Float(truncating: n) // Or: let x = n.floatValue
let nn = NSNumber(value: x)
print(n == nn) // false

另一方面,1.0可以完全表示为Float

let m = NSNumber(value: 1.0)
let y = m.floatValue
let mm = NSNumber(value: y)
print(m == mm) // true

这就是铸造m as? Float成功的原因。都

n.floatValue
Float(truncating: n)

可用于将数字“截断”到最接近的可表示32位浮点值。



 类似资料:
  • 问题内容: 如何从float转换为string或从string转换为float? 在我的情况下,我需要在2个值字符串(我从表中获得的值)和我计算出的浮点值之间进行断言。 我尝试从浮动到字符串: 但是断言失败 问题答案: 使用Java的类。 为了进行比较,将字符串转换为float并比较两个float总是更好。这是因为对于一个浮点数,存在多个字符串表示形式,与字符串相比,它们是不同的(例如“ 25”!

  • 问题内容: 所以我在这里想要做的是获取a ,将其转换为,作为数据报包通过网络发送,然后在接收终端将其转换回a 。 现在我知道我可以转换到使用方法。但是我不知道如何逆转换。 问题答案: 我认为您想利用具有和方法的类。

  • 奇怪的情况-下面是代码: 构建项目时(在项目属性中使用编译器选项Xlint:unchecked),我得到一个警告: 警告:[未选中]未选中的强制转换 ArrayList list=(ArrayList)obj[1]; 必需:ArrayList 找到:对象 但用同样的方法来浇铸字符串是可以的。这里有什么问题?

  • 问题内容: 我正在尝试将字符串转换为,但是得到了。 我的字串是,现在我将其转换为我所拥有的任何一个。 我如何将其转换为它们中的任何一个。 请帮助我摆脱这个问题。 问题答案: 您必须为数字使用适当的语言环境,例如 版画

  • 我想在Swift中将转换为。像这样的基本强制转换不起作用,因为这些类型不是原语,不像Objective-C中的s和s

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案