🌟
[Feature #21163] Kernel.#Float の解析と他の解析方法で一貫性がない、というチケット
[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つはどうなんでしょうねー
Discussion