0
は、私が最も近いダニに株式、指数先物の価格を丸めるする必要があります。最初のステップは、価格がティックの倍数であるかどうかを調べることです。アップルのドキュメントは言う、「CとObjective-C、また、浮動小数点数上で動作することができスウィフトの剰余演算における剰余演算子とは異なり」。スウィフト剰余演算精度
私が遊び場やコンソールアプリケーションに次のコードを書いて、私はそれを実行した場合、私は結果としてを期待するが、私は余り値が0.00999999999999775に等しい取得:
var stringPrice = "17.66"
var price = Double(stringPrice)
var tickSize: Double = 0.01
let remainder = price! % ticksize
この17.66このようaTickSizeなどaPriceや0.01などの値を使用した場合の問題は、私の丸め関数を破る:
func roundPriceToNearestTick(Price aPrice: Double, TickSize a TickSize: Double)-> Double{
let remainder = aPrice % aTickSize
let shouldRoundUp = remainder >= aTickSize/2 ? true : false
let multiple = floor(aPrice/aTickSize)
let returnPrice = !shouldRoundUp ? aTickSize*multiple : aTickSize*multiple + aTickSize
return returnPrice
}
この問題を解決する最良の方法は何ですか?
これはと同じ問題である(http://stackoverflow.com/questions/588004/is-floating-point-math-broken)[小数点演算が壊れて浮いている?] - '17.66'にすることはできませんバイナリ浮動小数点数として正確に表現されています。お金に関するすべての操作のための –
使用 'NSDecimalNumber'、山車とダブルスを避けます。ユーザーに小数の値を提示するために、 'NSNumberFormatter'を使用してください。自分でラウンド値にしないでください、それはあなたが思っているよりはるかに複雑な問題です。 – Sulthan