良くないニュースがあって、穏やかじゃない。
【Ruby】正確な小数の計算をするなら、FloatではなくBigDecimalを使う
要旨
[1] pry(main)> 1.1-1.0 => 0.10000000000000009 [2] pry(main)> require 'bigdecimal' => true [3] pry(main)> BigDecimal('1.1') - 1.0 => 0.1e0
詳細
1.1 - 1.0 の結果は、Float
の場合は誤差が出てしまっている。これは2進数で計算するときに生じる誤差である。なぜ誤差が生じるのかは、下記のサイトでビット列を見ると知ることができるが、詳細は割愛する。
BigDecimal
を使うと、(精度を指定して)正確な小数計算をさせることができる。
なお、BigDecimal
に Float
値を渡してはいけない。 必ず String
に変換が必要である。これは BigDecimal
オブジェクトが作られる前に誤差が発生することを回避するためである。 Integer
ならこの問題は起こらない。
[4] pry(main)> BigDecimal(1.0) ArgumentError: can't omit precision for a Float. from (pry):4:in `BigDecimal'
参考
【Ruby】binding.pryで気が済んだので以降のbinding.pryで止まらないようにするには、disable-pry
要旨
disable-pry
を入力してEnterを押すと、以降の binding.pry
では止まらなくなる。
$ ruby test.rb 1 From: /private/tmp/test.rb:5 : 1: require 'pry' 2: 3: (1..100).to_a.each do |i| 4: puts i => 5: binding.pry 6: end [1] pry(main)> 2 From: /private/tmp/test.rb:5 : 1: require 'pry' 2: 3: (1..100).to_a.each do |i| 4: puts i => 5: binding.pry 6: end [1] pry(main)> disable-pry 3 4 5 6 7 ... 100
詳細
なお、プログラムをそのまま終了させてしまって良い場合は、 exit!
の使用が良さそう。
参考
ちょっとやることが多くて…
今週、というより今月ずっと、ちょっといっぱいいっぱいになりそうで、、、
今日はスキップします
諸般の事情でスキップします🙇
【JavaScript】filterでfalsyな値を取り除くには、Array.prototype.filter(Boolean)で良い
要旨
['a', undefined, 1, null].filter(Boolean) // => ['a', 1]
詳細
filter
の構文は、次のようになっている。
let newArray = arr.filter(callback(element[, index, [array]])[, thisArg])
この時、 callback
に Boolean
を指定すると、 Boolean(element, index, array)
が呼ばれることになる。
ここで、 Boolean
のコンストラクタに着目する。 Boolean
は引数を1つしか取らない。JSは、仮引数で定義された個数を超えて実引数として多く渡した場合、その値は無視される。
よって、各要素は Boolean(element)
を評価した結果が callback
として呼ばれ、 truthy or falsy が戻り値となる。