Ruby中2.47-1.56计算结果为何不准确?如何修正?
Ruby浮点数计算精度问题的解决方法
这是二进制浮点数的固有特性导致的——部分十进制小数无法被二进制浮点数精确存储,2.47和1.56在转换为二进制时会存在微小误差,相减后误差被放大,就出现了0.9100000000000001这种不符合预期的结果。以下是几种解决方式:
使用
BigDecimal类处理精确小数计算
先引入标准库的BigDecimal,注意要用字符串初始化数值(避免浮点数本身的精度损耗),示例代码:require 'bigdecimal' num1 = BigDecimal('2.47') num2 = BigDecimal('1.56') result = num1 - num2 # 转换为浮点数输出 puts result.to_f # 输出 0.91 # 或者直接输出格式化后的字符串 puts result.to_s('F') # 输出 "0.91"对计算结果做四舍五入处理
如果只是需要展示指定小数位数的结果,可以直接调用round方法保留两位小数:result = 2.47 - 1.56 puts result.round(2) # 输出 0.91使用字符串格式化控制输出
通过sprintf或字符串格式化语法指定小数位数,自动完成四舍五入:result = 2.47 - 1.56 puts sprintf("%.2f", result) # 输出 "0.91" puts "%.2f" % result # 同上,输出 "0.91"
内容的提问来源于stack exchange,提问作者somenxavier
相关产品推荐
相关产品推荐

