数値を100分の1に四捨五入し、結果をJSONにシリアル化することを目的とした次のコードについて考えてみます。
require 'json'
def round_to_nearest( value, precision )
(value/precision).round * precision
end
a = [1.391332, 0.689993, 4.84678]
puts a.map{ |n| round_to_nearest(n,0.01) }.to_json
#=> [1.3900000000000001,0.6900000000000001,4.8500000000000005]
JSONを使用して、特定のレベルの精度ですべての数値をシリアル化する方法はありますか?
a.map{ ... }.to_json( numeric_decimals:2 )
#=> [1.39,0.69,4.85]
これは、Rubyの組み込みJSONライブラリまたは別のJSONgemのいずれかを使用している可能性があります。
編集:以下の回答へのコメントに記載されているように、私は、具体的には数字のフラット配列ではなく、数字を含む任意のデータのすべてのJSONシリアル化に対する一般的な解決策を探しています。
この特定のケースでは、メソッドを書き直すことで上記の問題を修正できることに注意してください。
def round_to_nearest( value, precision )
factor = 1/precision
(value*factor).round.to_f / factor
end
...しかし、これは、シリアル化中に精度レベルを強制するという一般的な要望を解決するものではありません。