Ruby中能否将BigDecimal('1')/BigDecimal('3')输出为任意长度全3小数?
Ruby中实现1/3输出任意长度全3小数的方法
你当前的代码出现非3数字的原因是:使用"%60.50f"格式化时,会将BigDecimal对象转换为Float类型,而Float是二进制浮点数,精度有限(仅约15-17位有效数字),无法精确表示1/3,因此超过精度范围后会出现误差值。
要输出任意长度、末尾全为3的1/3小数形式,有两种实用方案:
方案一:利用BigDecimal自身的高精度格式化
直接使用BigDecimal专属的格式化方法,避免转为Float丢失精度:
require "bigdecimal" # 计算1/3,BigDecimal会保留足够的精度存储循环小数 one_third = BigDecimal("1") / BigDecimal("3") # 方式1:用to_s指定格式,第一个参数'F'表示固定小数格式,第二个参数是小数位数 puts one_third.to_s('F', 50) # 输出:0.33333333333333333333333333333333333333333333333333 # 方式2:用sprintf的BigF格式符,直接处理BigDecimal puts "%60.50BigF" % one_third # 输出: 0.33333333333333333333333333333333333333333333333333
方案二:直接构造目标字符串
由于1/3的小数部分在数学上就是无限循环的3,直接生成对应长度的字符串是最高效的方式:
# 指定想要的小数位数 decimal_digits = 100 puts "0.#{"3" * decimal_digits}" # 输出:0.后面跟100个连续的3
内容的提问来源于stack exchange,提问作者nonopolarity
相关产品推荐
相关产品推荐

