Swift 4:奇怪的 Double 和 Float 行为

Dim*_*sov 1 floating-point macos double swift4

基本上问题是在这个例子中:

let d1 = NSNumber(value: 1.4);
let d2 = d1.doubleValue;

let f1 = NSNumber(value: Float(1.4));
let f2 = d1.floatValue;
Run Code Online (Sandbox Code Playgroud)

d1 结果 1.4
d2 结果 1.3999999999999999

f1 结果 1.4
f2 结果 1.3999999999999998

有谁知道这是为什么?

我正在尝试解析 JSON 文件,例如:

{"name": "something", "version": 1.4}
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

let json = try (JSONSerialization.jsonObject(with: someData) as? [String: Any])!;
let version: Double = (json["version"] as! NSNumber).doubleValue;
Run Code Online (Sandbox Code Playgroud)

或者

let version: Double = json["version"] as! Double;
Run Code Online (Sandbox Code Playgroud)

或者

let version: Double = json["version"] as! Float;
Run Code Online (Sandbox Code Playgroud)

我就是无法得到1.4 ...

四舍五入对我来说不是解决方案,因为我想将此数字写回 JSON 文件,该文件将被其他程序/语言解析,并且在文件中需要正好为 1.4。

有什么建议?

更新:问题 在于1.11.4。有没有问题 1.2, 1.3, 1.5

更新 2:序列化代码:

let d1 = NSNumber(value: 1.4);
let d2 = d1.doubleValue;

let f1 = NSNumber(value: Float(1.4));
let f2 = d1.floatValue;
Run Code Online (Sandbox Code Playgroud)

Dim*_*sov 5

好的,只是为了结束讨论。

最后Decimal类型成功了。因此,我将所有变量引用更改为DecimalNOT NSDecimalNumber,因为我收到了它不符合CodableDecodable协议的错误。也许有一个解决方法,但最简单的解决方案就是坚持使用Decimal.

我要感谢@JamesBucanek 和@EricPostpischil 加入讨论并帮助解决这个问题!!!

  • 谢谢!另请注意,从“Double”初始化的“Decimal”也会导致此问题。首先将`Double` 转换为`String`,例如`Decimal(string: "1.4")`。[参考](https://skagedal.github.io/2017/12/30/decimal-decoding.html) (2认同)