【问题标题】:How to round floats to scaled integers?如何将浮点数舍入为缩放整数?
【发布时间】:2016-08-11 14:45:55
【问题描述】:

为了进一步解释我的标题:我有一个浮点数组,我想对其进行四舍五入,但是,我想将这些数字四舍五入为一个不是最接近整数的数字。例如,假设我希望将数字四舍五入为最接近的整数,即 2 的倍数。这就是我所拥有的:

Temp = np.around(data,0)

data 是一个浮点数组。这些数字四舍五入到最接近的整数,但我希望它们四舍五入到最接近 2 的倍数。我的目标:

0.9 -> 0

1.1 -> 2

等等

谢谢!

【问题讨论】:

  • 1 不是 2 的因数吗?
  • 对此没有通用的方法。即,没有“四舍五入到最接近的斐波那契数”。您是特别想要“最接近 2 的倍数”还是只对一般方法的答案感兴趣?
  • 让我们具体说 2,因为如果需要,我可以从那里弄清楚如何更改它,@tom10
  • 考虑m.round(n/m)

标签: python math floating-point rounding


【解决方案1】:

二的倍数很简单:

x = np.array([0.9, 1.1, 10.2, 7.4])

2*np.round(x/2)   # array([  0.,   2.,  10.,   8.])

但是没有一个通用的方法来解决这个问题。例如,没有明显的“四舍五入到最接近的斐波那契数”。考虑2 的倍数公式,给定函数f(x)=2*x:1) 首先应用f 的倒数(在这种情况下除法),2) 然后round,3) 然后应用f结果。为此,f 必须存在,有逆,并且结果也必须是int;所以它只适用于少数功能。

【讨论】:

  • 多么棒但又简单又详细的答案。非常感谢,伙计,这完全解决了我的问题!
  • @tom10:但许多语言确实有“四舍五入”(又名“银行家的四舍五入”,尽管银行家通常不会那样四舍五入),并且根据定义,2 的倍数是偶数.有没有办法设置默认的舍入模式?
  • @tom10,不,显然没有。相反,你必须运用技巧来得到你想要的。
  • 四舍五入到最接近的斐波那契数将接近F(round(log(√5n)/log(φ)))
  • @RudyVelthuis:银行家的四舍五入是 tie 到最近的偶数,这与四舍五入到最近的偶数不同。也就是说,将值四舍五入到最接近的整数(无论是偶数还是奇数)。只有在两个连续整数的中间值的情况下才会选择偶数。
【解决方案2】:

以下是一种方法:

import math

data = [0.9, 1.1, 10.2, 7.4]

rounded_numbers = []

for num in data:

    rounded_up_num = math.ceil(num)

    if rounded_up_num % 2 == 0:
        rounded_num = rounded_up_num
    else:
        rounded_num = math.floor(num)

    rounded_numbers.append(int(rounded_num))

print rounded_numbers # [0, 2, 10, 8]

【讨论】:

  • 似乎是一个好方法。但是,如果您只评估一次math.ceil(num),执行速度会更快。
  • 很好的答案,不过有点过于复杂,因为它导致了一些我必须修复的错误。不过,谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多