最接近五的圆形货币
Round currency closest to five
我想将我的值四舍五入到最接近的 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
对于这种事情,远离浮点数确实更好,但你可能可以用这个提高一点准确性:
import Foundation
func roundToFive(n: Double) -> Double {
let f = floor(n)
return f + round((n-f) * 20) / 20
}
roundToFive(12.12) // 12.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)
根据您存储货币数据的方式,我建议使用字典或数组来查找原始美分值,并 return 使用预先计算的结果。根本没有理由进行计算,因为您知道 0 <= cents < 100.
如果您的货币是字符串输入,只需删除最后几位数字并进行字典查找。
round_cents = [ ... "12":"10", "13":"15", ... ]
如果您的货币是浮点值,那么,您已经发现了尝试这样做的乐趣。你应该改变它。
如果您的货币是数据类型或定点整数,只需取出美分部分并进行数组查找。
...
round_cents[12] = 10
round_cents[13] = 15
...
在任何一种情况下,您都可以这样做:
new_cents = round_cents[old_cents]
并完成它。
事实证明..真的很简单
let x: Float = 1.03 //or whatever value, you can also use the Double type
let y = round(x * 20) / 20
我想将我的值四舍五入到最接近的 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
对于这种事情,远离浮点数确实更好,但你可能可以用这个提高一点准确性:
import Foundation
func roundToFive(n: Double) -> Double {
let f = floor(n)
return f + round((n-f) * 20) / 20
}
roundToFive(12.12) // 12.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)
根据您存储货币数据的方式,我建议使用字典或数组来查找原始美分值,并 return 使用预先计算的结果。根本没有理由进行计算,因为您知道 0 <= cents < 100.
如果您的货币是字符串输入,只需删除最后几位数字并进行字典查找。
round_cents = [ ... "12":"10", "13":"15", ... ]
如果您的货币是浮点值,那么,您已经发现了尝试这样做的乐趣。你应该改变它。
如果您的货币是数据类型或定点整数,只需取出美分部分并进行数组查找。
...
round_cents[12] = 10
round_cents[13] = 15
...
在任何一种情况下,您都可以这样做:
new_cents = round_cents[old_cents]
并完成它。
事实证明..真的很简单
let x: Float = 1.03 //or whatever value, you can also use the Double type
let y = round(x * 20) / 20