Rails将小数舍入到十的最接近的幂

阿德里安·罗塔玛(Adrian Rotama)

我正在寻找一个Rails函数,该函数可以将数字返回到最近的幂十(10,100,1000),并且还需要支持0到1之间的数字(0.1、0.01、0.001):

round(9) = 10  
round(19) = 10  
round(79) = 100  
round(812.12) = 1000  

round(0.0321) = 0.01  
round(0.0921) = 0.1

我正在研究:使用字符串的长度将数字四舍五入到最接近十进制
的可接受答案,这不适用于0到1之间的数字。

已更新至最接近的10的幂次幂,这似乎很棒。但是我仍然无法使其在轨道上工作。

MaciejNędza

让我们将问题简化为以下形式-让输入数字在范围内[0.1, 1),这样对数字进行四舍五入会怎么样?

答案很简单-对于小于0.5我们将返回数字0.1的数字,对于较大数字则为1.0

我们要做的就是确保我们的电话号码在该范围内。我们将“移动”小数点分隔符,并记住在第二个变量中进行了多少移动。此操作称为标准化

def normalize(fraction)
    exponent = 0

    while fraction < (1.0/10.0)
        fraction *= 10.0
        exponent -= 1
    end

    while fraction >= 1.0
        fraction /= 10.0
        exponent += 1
    end

    [fraction, exponent]
end

使用上面的代码,您可以将任何浮点数表示为以10为底的一对归一化分数和指数。要重新创建原始数,我们将使用公式沿相反方向移动小数点

原始=标准化*基本^ {指数}

将数据属性标准化后,我们可以在简单的舍入方法中使用它,如下所示:

def round(number)
    fraction, exponent = normalize(number)

    if fraction < 0.5
        0.1 * 10 ** exponent
    else
        1.0 * 10 ** exponent
    end
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章