面试题答案
一键面试arr = [1.23456, 2.34567, 3.45678]
formatted_str = "Numbers: #{arr.map { |num| format('%.2f', num) }.join(', ')}"
puts formatted_str
浮点数精度问题及应对方法
精度问题
在计算机中,浮点数是用二进制表示的。但很多十进制小数无法精确地转换为二进制小数,例如 0.1
在二进制中是一个无限循环小数。这就导致在进行浮点数运算或格式化时,可能会出现微小的精度偏差。例如:
(0.1 + 0.2).to_s # 输出 "0.30000000000000004"
Ruby中的应对方法
- 使用
BigDecimal
类:BigDecimal
类提供了任意精度的十进制数运算。
require 'bigdecimal'
result = BigDecimal('0.1') + BigDecimal('0.2')
puts result.to_s # 输出 "0.3"
- 格式化输出控制:在格式化输出浮点数时,使用
format
或sprintf
方法,通过指定精度来控制显示的小数位数,避免显示出精度偏差的部分。例如:
num = 0.1 + 0.2
puts format('%.2f', num) # 输出 "0.30"
这种方式虽然没有解决实际的精度问题,但可以在显示层面上提供更符合预期的结果。