栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

迅速:将字符串转换为双精度的问题

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

迅速:将字符串转换为双精度的问题

这里有两个不同的问题。首先,正如评论中已经提到的那样,二进制浮点数不能

8.7
精确表示该数字。Swift使用IEEE
754标准来表示单精度和双精度浮点数,如果您分配

let x = 8.7

然后最接近的可表示数字存储在中

x
,即

8.699999999999999289457264239899814128875732421875

第二个问题是:为什么数字有时打印为“ 8.7”,有时打印为“ 8.6999999999999993”?

let str = "8.7"print(Double(str)) // Optional(8.6999999999999993)let x = 8.7print(x) // 8.7

Double("8.7")
从不同
8.7
?一个比另一个更精确吗?

要回答这些问题,我们需要知道

print()
函数的工作方式:

  • 如果参数符合
    CustomStringConvertible
    ,则打印函数将调用其
    description
    属性并将结果打印到标准输出。
  • 否则,如果参数符合
    CustomDebugStringConvertible
    ,则打印函数调用is
    debugDescription
    属性,并将结果打印到标准输出。
  • 否则,将使用其他机制。(出于我们的目的,此处未导入。)

Double
类型符合
CustomStringConvertible
,因此

let x = 8.7print(x) // 8.7

产生与输出相同的输出

let x = 8.7print(x.description) // 8.7

但是发生了什么

let str = "8.7"print(Double(str)) // Optional(8.6999999999999993)

Double(str)
可选的 ,并
struct Optional
不会 符合
CustomStringConvertible
,而是要
CustomDebugStringConvertible
。因此,print函数调用的
debugDescription
属性
Optional
,该属性又调用
debugDescription
基础的
Double
。因此,除了是可选的以外,数字输出与

let x = 8.7print(x.debugDescription) // 8.6999999999999993

但是

description
debugDescription

浮点值之间有什么区别?从Swift的源代码中,可以看到两者最终都
swift_floatingPointToString

在Stubs.cpp中调用了
Debug
参数分别设置为
false
和的函数
true
。这控制了数字到字符串转换的精度:

  int Precision = std::numeric_limits<T>::digits10;  if (Debug) {    Precision = std::numeric_limits<T>::max_digits10;  }

有关这些常量的含义,请参见http://en.cppreference.com/w/cpp/types/numeric_limits:

  • digits10
    –可以不改变地表示的小数位数,
  • max_digits10
    –区分此类型的所有值所必需的小数位数。

因此,

description
创建一个具有较少十进制数字的字符串。该字符串可以转换为a
Double
并返回给相同结果的字符串。
debugDescription
创建具有更多十进制数字的字符串,以便任何两个不同的浮点值将产生不同的输出。


摘要:

  • 大多数十进制数字不能完全表示为二进制浮点值。
  • 浮点类型的
    description
    debugDescription
    方法使用不同的精度来转换为字符串。作为结果,
  • 打印 可选 浮点值与打印非可选值所使用的精度不同。

因此,根据您的情况,您可能希望在打印可选件之前将其拆开:

let str = "8.7"if let d = Double(str) {    print(d) // 8.7}

为了更好地控制,请使用

NSNumberFormatter
%.<precision>f
格式或对格式进行格式化。

另一种选择是使用

(NS)DecimalNumber
而不是
Double



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号