Ruby中.round(precision)方法失效问题排查与解决请求
问题解答
1. 为何.round(4)方法无法生效?
你代码里用了Ruby的div(3)方法,这是整数除法——不管被除数是整数还是浮点数,它都会返回整数结果。整数调用.round(4)不会产生小数部分,因为整数本身没有小数位,所以看起来方法没起作用。比如5.div(3)得到1,1.round(4)还是1,不会变成1.6667。
2. 正确实现四位小数精度的方法
把整数除法改成浮点数除法即可,两种常用修改方式:
方式一:用fdiv替换div
fdiv是浮点数除法方法,返回结果为浮点数,之后调用.round(4)就能得到四位小数的浮点数:
def bar_triang(p1,p2,p3) bary = [] x0 = [p1[0], p2[0], p3[0]].sum x0t = x0.fdiv(3) # 替换div为fdiv x0tf = x0t.round(4) bary.push(x0tf) y0 = [p1[1], p2[1], p3[1]].sum y0t = y0.fdiv(3) # 替换div为fdiv y0tf = y0t.round(4) bary.push(y0tf) p bary end
方式二:将求和结果转为浮点数后再除法
如果不想用fdiv,可以把sum的结果转成浮点数,再除以3,同样能得到浮点数结果:
def bar_triang(p1,p2,p3) bary = [] x0 = [p1[0], p2[0], p3[0]].sum.to_f # 转为浮点数 x0t = x0 / 3 x0tf = x0t.round(4) bary.push(x0tf) y0 = [p1[1], p2[1], p3[1]].sum.to_f # 转为浮点数 y0t = y0 / 3 y0tf = y0t.round(4) bary.push(y0tf) p bary end
比如传入[[4, 6], [12, 4], [10, 10]],两种方式都会返回[8.6667, 6.6667],符合四位小数浮点数数组的需求。
内容的提问来源于stack exchange,提问作者Panamaniac507
相关产品推荐
相关产品推荐

