四舍五入到最近的奇数位。

我想将一些数字四舍五入到最近的十分位,只使用奇数十分位。例如:

91.15 -> 91.1
91.21 -> 91.3

有没有一个简单而通用的方程可以做到这一点?

点赞
用户405017
用户405017

这不是四舍五入到最近十分位,而是四舍五入到最近的五分位(两个十分位)并加上一个十分位的偏移量。因此,通用的方程式如下:

# 在任何一个 round 函数四舍五入的编程语言中都适用
radioStation = round( (original-offset)/interval ) * interval + offset

在 Lua 中的实现如下:

-- number:   要四舍五入的原始值
-- interval: 期望值之间的距离
-- offset:   值的可选偏移量
function roundToNearest( number, interval, offset )
  offset   = offset   or 0  -- 默认值
  interval = interval or 1  -- 默认值
  return math.floor( (number-offset)/interval + 0.5 ) * interval + offset
end

for n=1, 2, 0.09 do
  local result = roundToNearest(n, 0.2, 0.1)
  print(string.format("%.2f : %g", n, result))
end
--> 1.00 : 1.1
--> 1.09 : 1.1
--> 1.18 : 1.1
--> 1.27 : 1.3
--> 1.36 : 1.3
--> 1.45 : 1.5
--> 1.54 : 1.5
--> 1.63 : 1.7
--> 1.72 : 1.7
--> 1.81 : 1.9
--> 1.90 : 1.9
--> 1.99 : 1.9
2014-01-07 22:25:30
用户869951
用户869951

如何

function roundToOdd(number)
    temp = math.floor(number * 10 + 0.5)
    if temp % 2 == 0 then
        -- 第一位小数是偶数,需要决定是“向上”还是“向下”“舍入”
        if number > temp/10 then
            -- 更接近下一个奇数数字 “向上”
            temp = temp + 1
        else
            -- 更接近下一个奇数数字 “向下”
            temp = temp - 1
        end
    end
    return temp/10
end

for n=1, 2, 0.09 do
  local result = roundToOdd(n, 0.2, 0.1)
  print(string.format("%.2f : %g", n, result))
end
print(91.15,roundToOdd(91.15))
print(91.21,roundToOdd(91.21))

结果:

1.00 : 0.9
1.09 : 1.1
1.18 : 1.1
1.27 : 1.3
1.36 : 1.3
1.45 : 1.5
1.54 : 1.5
1.63 : 1.7
1.72 : 1.7
1.81 : 1.9
1.90 : 1.9
1.99 : 1.9
91.15   91.1
91.21   91.3
2014-01-07 23:07:58
用户5670219
用户5670219

首先让我们回答一个问题,如何快速高效地找到最近的奇整数,而不需要分支和比较。然后,该公式可以通过在变换之前先将其乘以10的幂次,然后再通过同样的10的幂次除以它(再转换回浮点数)来扩展到上述问题,例如:最近的奇数十分位为10,最近的奇数百分位为100等。

如果您正在使用具有截断除法和位移运算符支持的语言,如Java或C++,请使用此一行公式:

// Java : with bit-shift
static int nearestOdd(float num) {
    return 1 + (((int)(num + 1.0f) - 1) & 0xFFFFFFFE);
}

// Java : without bit-shift.
static int nearestOdd(float num) {
    return 1 + 2 * (((int)(num + 1.0f) - 1) / 2);
}

在C++中:

// C++
int nearestOdd(float num) {
  return 1 + ((static_cast<int>(num + 1.0f) - 1) & 0xFFFFFFFE);
}
2022-12-31 13:48:23