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?
答案 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