如何通过编程确定字符串除法运算中商的scale?
问题分析与修复
你的determineResultScale函数核心错误在于混淆了商的基准scale计算逻辑,导致部分场景下scale计算偏移。
具体问题点
基准scale计算错误:
你错误地用原始numberScale作为商的scale基准,正确的基准应该是被除数scale与除数scale的差值(numberScale - divisorScale)。在你的示例中:- 120321的scale为5(对应105量级),22的scale为1(对应101量级),基准scale应为
5-1=4。 - 缩放后除数变为220000,此时120321 < 220000,说明商的量级需要在基准上减1,即
4-1=3(正确结果),但你的代码返回5-1=4,这就是错误根源。
- 120321的scale为5(对应105量级),22的scale为1(对应101量级),基准scale应为
scale修改逻辑冗余且错误:
当divisorScale > numberScale时,你将numberScale取反的操作完全不符合量级逻辑,缩放数字仅为了比较大小,不需要修改原始scale的差值计算。特殊场景处理逻辑错误:
相同scale时直接返回0或-1的逻辑不严谨,比如5/10的场景,商为0.5,scale应为-1,但你的代码会错误返回0。
修复后的代码
long long determineResultScale(const std::string& _number, const std::string& _divisor) { std::string number = _number, divisor = _divisor; long long numberScale = determineScale(number); const long long divisorScale = determineScale(divisor); // 核心:商的基准scale是被除数与除数的scale差值 long long baseScale = numberScale - divisorScale; const long long diffScale = std::abs(numberScale - divisorScale); // 统一两个数的scale,仅用于大小比较 auto scaleFactor = power("10", std::to_string(diffScale), 0); if (divisorScale > numberScale) { number = multiply(number, scaleFactor, 0); } else if (numberScale > divisorScale) { divisor = multiply(divisor, scaleFactor, 0); } // 根据比较结果调整最终scale int cmpResult = compare(number, divisor, 0); return cmpResult >= 0 ? baseScale : baseScale - 1; }
验证示例
针对你的测试用例120321/22:
- 基准scale = 5 - 1 = 4
- 缩放后除数为220000,120321 < 220000,返回4-1=3,与正确结果一致。
内容的提问来源于stack exchange,提问作者ZCGCoder
相关产品推荐
相关产品推荐

