首页 > 解决方案 > Swift:将浮点数舍入到最近的自定义乘数

问题描述

我正在创建一个函数,该函数根据自定义变量粒度将视图框架的 CGFloat 舍入为其最接近的离散值。

例如,如果我的粒度(乘数)是 0.25,我正在尝试创建一个函数,它接受 0.3 的输入并返回 0.25,或者 3.89 并返回 4.00(关闭 0.25 的倍数)。到目前为止,我已经找到了几篇关于如何四舍五入到最接近小数的帖子,但它们似乎不适用于这种情况。

let x = 1.23556789
let y = Double(round(1000*x)/1000)
print(y) //This removes all decimals but three, but only seem to work with multiples of 10.

关于我如何去做这件事的任何想法?

谢谢!

标签: swift

解决方案


您可以使用与此处舍入到 10 次方相同的方法。

当你想四舍五入到最接近的 0.1 时,你乘以 10,四舍五入,然后除以 10。当你想要四舍五入到最接近的 0.01 时,你乘以 100,四舍五入,然后除以 100。

看到这里的模式了吗?您乘以除以的数字在粒度上始终是 1!

所以对于 0.25 的粒度,你乘以和除以 4:

print(round(0.3 * 4) / 4)
// or
print(round(0.3 / 0.25) * 0.25)

更一般地,给定 agranularity: Double和一个数字来舍入x: Double,我们可以像这样舍入它:

let rounded = round(x / granularity) * granularity

推荐阅读