MST
星途 面试题库

面试题:Ruby字符串插值与格式化输出 - 高级难度

假设你有一个数组arr = [1.23456, 2.34567, 3.45678],要求使用格式化输出将数组中的每个浮点数保留两位小数,并使用字符串插值将这些格式化后的数字连接成一个字符串,格式为:'Numbers: 1.23, 2.35, 3.46'。同时,解释一下在处理浮点数格式化时可能遇到的精度问题以及Ruby中如何应对。
15.7万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
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中的应对方法

  1. 使用 BigDecimalBigDecimal 类提供了任意精度的十进制数运算。
require 'bigdecimal'
result = BigDecimal('0.1') + BigDecimal('0.2')
puts result.to_s # 输出 "0.3"
  1. 格式化输出控制:在格式化输出浮点数时,使用 formatsprintf 方法,通过指定精度来控制显示的小数位数,避免显示出精度偏差的部分。例如:
num = 0.1 + 0.2
puts format('%.2f', num) # 输出 "0.30"

这种方式虽然没有解决实际的精度问题,但可以在显示层面上提供更符合预期的结果。