🌟

[Feature #21163] Kernel.#Float の解析と他の解析方法で一貫性がない、というチケット

2025/03/06に公開

[Feature #21163] Inconsistencies in Kernel.Float compared to other number parsing methods

  • Kernel.#Float の解析と他の解析方法で一貫性がない、というチケット
  • いくつかのケースが提示されているんですが1つ目は Kernel.#Float に16進数表記の文字列を渡したときの話
  • Kernel.#Float メソッドは以下のように文字列から Float 値に変換することができます
p Float("3.14")
# => 3.14
  • またこれは16進数表記にも対応しています
p Float("0x10")
# => 16.0
  • Ruby 3.4 から更に以下のように小数を含む16進数表記にも対応しています
p Float("0x10.8")
# => 16.5
  • これなんですが対応しているのは16進数のみで8進数表記や2進数表記には対応していません
# これはそもそも8進数ではなくて10進数として解析される
p Float("010.4") # => 10.4

# 2進数表記はエラーになる
# error: invalid value for Float(): "b10.1" (ArgumentError)
# p Float("0b10.1")
  • 2つ目は String#to_f の話
  • こちらも文字列から Float 値に変換するメソッドです
p "3.14".to_f
# => 3.14
  • ただし Kernel.#Float とは違い16進数表記の場合は解析されずに 0.0 を返します
p "0x10".to_f
# => 0.0
  • 最後は Kernel.#Integer との挙動の差異です
  • Kernel.#Integer は途中に _ があっても問題なく解析されます
p Integer("0x1_0a")
# => 266
  • 一方 Kernel.#Float でも以下のような文字列は問題なく解析されますが
p Float("0x1_0")
# => 16.0
  • 次のような場合はエラーになります
# error: invalid value for Float(): "0x1_0a" (ArgumentError)
p Float("0x1_0a")
  • 細かい点でいくつか挙動に差異がありますねー
  • このチケットでは3つ目の _ がある場合にエラーになる不具合だけ開発版の Ruby 3.5-dev で修正されています
p Float("0x1_0a")
# Ruby 3.4 => error: invalid value for Float(): "0x1_0a" (ArgumentError)
# Ruby 3.5 => 266.0
  • 他2つはどうなんでしょうねー
GitHubで編集を提案

Discussion