foxの数値型について

https://bitbucket.org/x768/fox-lang

foxの組み込み数値型は3種類あります。

puts typeof(1)    // lang.Int (整数型)
puts typeof(1.0)  // lang.Float (浮動小数点数)
puts typeof(1d)   // lang.Frac (有理数型)

違う型同士の演算はエラーとなるため、明示的に型を合わせる必要があります。

puts 1 + Int(1.0)   // 2
puts Float(1) + 1.0 // 2.0
puts 1 + 1.0        // TypeError

Int (整数型)

32bit整数を超える範囲は多倍長整数になりますが、どちらも区別なく扱えます。

puts 1234567890 * 1234567890

リテラルは、10進数、16進数と、2進数が使えます。

puts 0x1234_5678_90AB_CDEF
puts 0b1010_1101_1111_0000

加減乗除と、剰余演算が可能です。

Float (浮動小数点数)

IEEE754形式(倍精度)の浮動小数点数です。

puts 1.0    // 1.0
puts 1e+6   // 1000000.0

ゼロ除算はエラーになります。

puts 1.0 / 0.0   // ZeroDivisionError

Frac (有理数型)

内部的には、分子/分母 の形式で値を保持していますが、10進数の小数と同じように扱うことができます。

let f = 0.75d
puts f   // 0.75
puts f.numerator, '/', f.denominator  // 3/4

let f3 = Frac(1, 3)   // 1/3
puts f3       // 0.333333...
puts f3 * 3d  // 1.0

mathモジュールの関数を使うことで端数処理ができるので、JavaBigDecimalの代わりに使えます。

import math

puts round_floor(1.5d)       // 1.0
puts round_ceiling(-1.5d)    // -1.0
puts round_half_up(1.45)     // 1.0
puts round_half_up(1.45, 1)  // 1.5