最接近五的圆形货币

时间:2016-02-24 21:38:46

标签: swift rounding

我想将我的值舍入到最接近的5美分,例如:

5.31 -> 5.30
5.35 -> 5.35
5.33 -> 5.35
5.38 -> 5.40

目前,我是通过使用以下方式获取小数值来实现的:

let numbers = 5.33
let decimal = (numbers - rint(numbers)) * 100
let rounded = rint(numbers) + (5 * round(decimal / 5)) / 100

// This results in 5.35

我想知道是否有一个更好的方法,步骤更少,因为有时numbers - rint(numbers)给了我一个奇怪的结果,如:

let numbers = 12.12
let decimal = (numbers - rint(numbers)) * 100

// This results in 11.9999999999999

4 个答案:

答案 0 :(得分:3)

最好远离浮点这种事情,但你可以用这个来提高准确性:

import Foundation

func roundToFive(n: Double) -> Double {
  let f = floor(n)
  return f + round((n-f) * 20) / 20
}

roundToFive(12.12) // 12.1

答案 1 :(得分:3)

原来......真的很简单

let x: Float = 1.03 //or whatever value, you can also use the Double type
let y = round(x * 20) / 20

答案 2 :(得分:1)

我将使用round函数和NSNumberFormatter,但稍微不同的算法

我在考虑使用%,但我将其更改为/

let formatter = NSNumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2

//5.30
formatter.stringFromNumber(round(5.31/0.05)*0.05)
//5.35
formatter.stringFromNumber(round(5.35/0.05)*0.05)
//5.35
formatter.stringFromNumber(round(5.33/0.05)*0.05)
//5.40
formatter.stringFromNumber(round(5.38/0.05)*0.05)
//12.15
formatter.stringFromNumber(round(12.13/0.05)*0.05)

答案 3 :(得分:1)

根据您存储货币数据的方式,我建议使用字典或数组来查找原始分数值,并返回预先计算的结果。根本没有理由进行计算,因为你知道0 <=美分&lt; 100。

如果您的货币是字符串输入,只需砍掉最后几位数字并进行字典查找。

round_cents = [ ... "12":"10", "13":"15", ... ]

如果您的货币是浮点值,那么您已经发现了尝试这样做的乐趣。你应该改变它。

如果您的货币是数据类型或固定点整数,只需将美分部分取出并进行数组查找。

...
round_cents[12] = 10
round_cents[13] = 15
...

在任何一种情况下,您都可以:

new_cents = round_cents[old_cents]

并完成它。