浮点和双精度算术没有返回准确的结果?

时间:2019-02-11 08:36:33

标签: swift floating-point

SWIFT / IOS对股价执行一些算术运算,然后进行减去以得出每日的损益图。

使用默认的Float类型时,我在下面得到的结果不准确(请参见操场代码)。

import UIKit

var str = "Hello, playground"

let y: Float = 129.08

let t: Float = 130.29

let subtracted = t - y // results in 1.209991 !!!!!! not accurate, should be something like 1.209998

let returnVal = subtracted / y // Results in 0.009373966 also inaccurate

如果我在电子表格中实现相同的算法,则会得到预期的结果(或接近该死的结果):130.29-129.08 = 1.20999999999998。

我犯了一些基本错误吗?有一个经验吗?如何获得与电子表格相同的结果(相对于我正在验证计算的结果)。

好的,所以我更新了,包括在答复中建议的从Float到Double的转换,并查看结果! Double(float_value)转换似乎在结果的低有效位数中添加了垃圾。

import UIKit

var str = "Hello, playground"

let y_float: Float = 129.08

let t_float : Float = 130.29

let y: Double = Double(y_float) // results in 129.0800018310547 !!!

let t: Double = Double(t_float) // results in 130.2899932861328

let subtracted : Double = t - y

let returnVal = subtracted / y

所以现在的问题是,有什么方法可以将Float转换为Double?

3 个答案:

答案 0 :(得分:1)

使用Double

let y: Double = 129.08

let t: Double = 130.29

let subtracted: Double = t - y

答案 1 :(得分:0)

Float和Double使用以2为基的内部编码,因此总会有一些它们不能准确表示的以10为基的值。

如果要使用真正的十进制(以10为底)计算,请使用Decimal类型:

let y = Decimal(string:"129.08")!

let t = Decimal(string:"130.29")!

let subtracted = t - y // results in 1.21

let returnVal = subtracted / y // Results in 0.00937403160830492717694453052370622869

请注意,我使用字符串来初始化值,因为文字将首先作为Float处理,并且在赋值之前会产生相同的错误。

答案 2 :(得分:-2)

好的,所以我环顾四周,发现

Rounding a double value to x number of decimal places in swift

我将用来整理浮点值并消除不准确性。我还将在电子表格中实现类似的截断,以确保对齐。

代码如下:

import UIKit

var str = "Hello, playground"

var y_float: Float = 129.08

let t_float : Float = 130.29

var y: Double = Double(y_float * 1000).rounded() / 1000 // results in 129.08

var t: Double = Double(t_float * 1000).rounded() / 1000 // results in 130.29

let subtracted : Double = t - y

let returnVal = subtracted / y