【问题标题】:Round up/off to nearest 5四舍五入到最接近的 5
【发布时间】:2015-11-05 14:37:34
【问题描述】:

我正在尝试将数字列表四舍五入到最接近的 5 和最接近的 10。

示例:

1562
1706
1665
1378
1439

我创建了这个代码来四舍五入到最接近的 5:

:exe "%s/\\d\\d\\d\\d/\\=substitute(submatch(0).'\\.0', '.*', (round(submatch(0)/5)*5), 'g')/g"

在替换的第一部分,我想从子匹配值中创建一个浮点数,将 .0 添加到子匹配值。

预期结果:

1560
1705
1665
1380
1440

但是,它给出了一个尾随字符错误。 我做错了什么?

【问题讨论】:

    标签: vim numbers rounding


    【解决方案1】:

    由于/ 作为除法运算符出现在替换字符串中,您需要为:s 命令使用另一个分隔符。根据 documentation,这可以是任何其他单字节字符,但不能是字母数字字符、'\'、'"'' 或 '|'。

    要将数字 n 舍入到最接近的 k 倍数,您可以这样做:

    (n + k/2) / k * k
    

    把这些放在一起,命令可以是:

    :%s!\v\d{4}!\=(submatch(0) + 2) / 5 * 5!
    

    【讨论】:

    • 非常感谢。如果我只想round up 或只想round off 到最接近的 5,你知道公式是什么吗?我一直在尝试,但找不到正确的公式。
    • @Reman:您可以尝试(n + (k-1))/k*k 向上取整,n/k*k 向下取整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多