将 NSNumber 转换为 Float 时出现意外行为

2023-12-19

升级到 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。第二次转换成功,并实例化了 Floatinit:truncating构造函数也成功,即z == 1.12。将 n 强制转换为 Double 成功,这对我来说根本没有意义。

谁能向我解释这种行为? IE。谁能给我一个充分的理由为什么将 n 转换为 Float 失败?这是一个错误吗?如果这是预期行为,您能否参考 Swift 文档中描述此行为的位置?


这是一个后果SE-0170 NSNumber 桥接和数字类型 https://github.com/apple/swift-evolution/blob/master/proposals/0170-nsnumber_bridge.md,在 Swift 4 中实现:

as? for NSNumber应该意味着“我可以安全地将存储在这个名为 NSNumber 的不透明框中的值表示为我想要的值吗?”。

1.12是一个浮点文字,并推断为Double, so 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 位浮点值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 NSNumber 转换为 Float 时出现意外行为 的相关文章

随机推荐

  • C++ 编译器可以消除未读取的易失性局部变量吗

    说 我有这个代码 int f volatile int c c 34 return abc The 易失性 int c从来没有读过 但它被标记为volatile 编译器可以完全消除它吗 我在 Visual C 2010 中的测试显示了矛盾的
  • git“松散的对象...已损坏”-我丢失了哪些数据?

    我已经对本地分支做了一些提交 然后我尝试这样做git fetch 它失败并出现以下错误 fatal loose object 7b36029a951eacd979d24e993e020c4d018ca265 stored in git ob
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • UITableView 中的颜色交替 UITableViewCell?

    我试图使用此方法在表视图中为备用 tableCell 着色链接到颜色单元格 http blog apoorvmote com customize uitableviewcell background color ios 8 swift 用这
  • 我可以设置 Vert.x HTTP 请求队列的容量吗?

    我用 Java 编写了一个 Vert x HTTP 服务器 当客户端发送请求的速度快于服务器处理请求的速度时 服务器端请求队列会慢慢填满 最终 JVM 由于所有累积的请求而耗尽内存 我可以设置 Vert x 请求队列的容量吗 我想设置以下一
  • 我应该使用什么 OSX/XCode 版本控制系统来进行 iPhone 开发?

    我一直在兼职开发我的第一个 iPhone 应用程序 并希望开始使用比过去四个月更严格的版本控制形式 即将源代码文件夹复制到另一个目录并为其添加时间戳 我使用过 SourceSafe 和 Team Foundation System 但不太清
  • 导入并运行文件夹中的所有模块

    有没有办法导入并运行文件夹中的所有 py 文件 基本上我认为 pytest 是如何进行测试发现的 似乎我想从文件路径导入到列表中 然后在每个模块上调用 main args 迭代列表 它还需要兼容 python 2 和 3 Example s
  • 变量中 Linq 查询的 Lambda 表达式

    如何定义要在 linq 查询中用作变量的 lambda 表达式 例如 当按列表项的不同属性对通用列表进行排序时 IList
  • 找到Python解释器的完整路径?

    如何从当前执行的 Python 脚本中找到当前运行的 Python 解释器的完整路径 sys executable包含当前运行的Python解释器的完整路径 import sys print sys executable 现在是记录在这里
  • 将 PHP 实体(如 – 或 š)转换为其适用的字符

    有没有办法将 HTML 实体转换为其适用的字符 类似的东西html entity decode 我正在尝试从 TinyMCE 输出中制作没有 HTML 实体的普通文本 根据用户贡献的笔记 http de php net manual en
  • IE11 中的 http 伪流

    我有一些视频 我需要能够找到其中的各个点 而无需在该点之前下载整个视频 到目前为止 我使用带有 NodeJS 的 html5 视频标签和 vid streamer 模块 在 Firefox 和 Chrome 中运行得很好 然而 IE 11
  • 选择数组结束项的最有效方法?

    我正在寻找最有效的方法 即按下较小的键 来索引数组的最后一个元素 然后像 a lt c 1 2 3 n lt length a b lt a n 不应该使用 我想只使用一个命令 在上面的例子中我可以使用 b lt a length a 但我
  • Android 清除/完成之前的活动(除了一项)

    在android中我有以下路径 活动 1 gt 活动 2 gt 活动 3 gt 活动 N gt 按下按钮 当按下按钮时 我想清除 完成从活动 2 到 N 的所有活动 然后转到活动 X 换句话说 我想完成所有活动 直至最初的一个 然后移至另一
  • 在 R 中识别传单中栅格上的点击位置

    我正在绘制一个大型经纬度 NetCDFraster超过一个Rleaflet地图使用shinydashboard 当我单击地图时 会出现一个弹出窗口 显示行 列 经纬度位置和单击的栅格点的值 参见下面的可重现代码 问题是 如果栅格足够大 我会
  • 进度条无法使用带有 Angular cli 的 Service Worker

    我们正在开发 Angular 4 应用程序 并使用 cli 启用服务工作人员 一切都很好 除了文件上传进度条停留在 0 只有完成后才会达到 100 我们怀疑这是由于 Service Worker 造成的 因为我们在开发环境中没有看到它 奇怪
  • 如何使用gcloud命令行部署多个功能?

    我想部署多个云功能 这是我的index js const batchMultipleMessage require gcf 1 const batchMultipleMessage2 require gcf 2 module exports
  • 我可以请求 SQL Server 缓存某个结果集吗?

    某个查询正在从 ASP NET 页面调用 我在 Management Studio 中研究了该查询的执行计划 87 用于排序 我非常需要排序 否则显示的数据将毫无意义 无论如何 我是否可以请求 SQL Server 缓存排序的结果集 以便它
  • 是否可以在不知道c中数组长度的情况下使用gets?

    如果我们想在 c 中使用 gets 我们会这样做 int main void char str 100 while gets str printf s n str 我们必须先知道str的长度 即100 然后使用gets 是否可以在不知道c中
  • @Pattern 用于字母数字字符串 - Bean 验证

    我在 bean 中有一个变量名 我想添加 Pattern验证仅接受字母数字 目前 我有这个 NotNull Pattern regexp A Za z0 9 String name 但错误是Invalid regular expressio
  • 将 NSNumber 转换为 Float 时出现意外行为

    升级到 Xcode 9 3 9E145 后 我的应用程序显示了一些意外的行为 问题似乎在于将 NSNumber 转换为 Float 我用as为此类型转换运算符 请参阅以下示例 let n NSNumber init value 1 12 l