将数字舍入和固定到特定端的算法

问题描述 投票:0回答:1

我正在寻找一种有效的算法,将整数值限制在一个范围内,同时还将其基数 10 端更改为多个可变长度端之一。

这应该在

value
min
之间夹住
max
,同时将末端更改为
ends
中定义的特定末端之一,尽可能接近原始值。

输入数据示例:

ends: [26, 201, 300] (sorted list of integers, at least a factor 10 smaller than <value>)
min: 5350
max: 7392

value: 2000
->
5426

value: 6205
->
6201

value: 7400
->
7300

我将在 Go 中实现这一点,但也欢迎任何伪代码或其他命令式语言。

algorithm go numbers rounding clamp
1个回答
0
投票

我猜你知道如何夹紧:

clamp(n, min, max) = max(min, min(max, n))

然后要删除末尾并将其替换为应该结束的内容,您需要 10 的下一个更高的幂:

nextPowerOf10(n) {
    if (n == 0)
        return 10    // mathematically not correct but works here
    x = 1
    while (n > 0) {
        x = x * 10
        n = n / 10    // integer division
    }
    return x
}

因此替换被夹紧数字的末尾

c
变得简单:

replace(n, end) = n % nextPowerOf10(end) + end

然后你就可以查对方的号码了,一切都放在一起了:

clampEnd(n, min, max, end) {
    m = clamp(n, min, max)
    p = nextPowerOf10(end)
    m = m % p + end
    if (m < n && n - m >= m + p - n)
        return m + p
    else if (m > n && m - n > n - m + p)
        return m - p
    return m
}
© www.soinside.com 2019 - 2024. All rights reserved.