R语言加权算术均值函数权重判断异常问题咨询
浮点数精度误差导致判断失效的原因分析
这是典型的浮点数精度误差问题,R语言中的十进制小数(比如0.1、0.31这类)是以二进制浮点数形式存储的,而大部分十进制小数无法被二进制浮点数精确表示,相加后会产生极其微小的偏差:
- 比如
0.6 + 0.3 + 0.1,实际计算结果并非严格的1,而是1.0000000000000002; 0.31 + 0.59 + 0.1的实际结果则是0.9999999999999999,和理论值1存在极小差距。
你的判断条件用了==,这个运算符会严格检查两个值是否完全一致,哪怕是万亿分之一的误差也会判定为不相等,所以这些理论上和为1的权重组合会触发错误提示。
修复方案
不要直接用==判断浮点数相等,改用检查差值是否小于一个极小的阈值(比如1e-10),示例代码如下:
candidateScores = function(weight1, weight2, weight3) { total_weight <- weight1 + weight2 + weight3 if(abs(total_weight - 1) < 1e-10) { BobScore = 9*weight1 + 6*weight2 + 4*weight3 SueScore = 7*weight1 + 7*weight2 + 6*weight3 HyolynScore = 4*weight1 + 8*weight2 + 8*weight3 print(paste("Bob's Score: ", BobScore)) print(paste("Sue's Score: ", SueScore)) print(paste("Hyolyn's Score: ", HyolynScore)) } else { print("Your weights do not add up to 1.") } }
也可以将权重转换为整数计算(比如乘以100转成整数相加,判断是否等于100),从根源上避免浮点数误差。
内容的提问来源于stack exchange,提问作者Rosie
相关产品推荐
相关产品推荐

