swift - 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.
关于我如何去做这件事的任何想法?
谢谢!
解决方案
您可以使用与此处舍入到 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
推荐阅读
- nuxt.js - 我可以在导航而不是在生成执行期间执行 nuxt asyndata 挂钩吗?
- javascript - 在个人网站上发布谷歌博客现货博客
- qt - 将事件传播到整个对象
- java - Java slackbot - 未处理的异常错误
- reactjs - 带有 React Router 的 React-bootstrap 导航栏
- python-3.x - 使用属性或引用的anytree nodemixin
- java - 挂载 /tmp 时 Elasticsearch 服务失败 noexec
- javascript - JS:像 SQL 一样的 JSON 数据查询
- spring - 修复 springboot 中的 Rabbitmq 连接超时
- vim - 让 Vim 只对长行忽略语法高亮