rubyで9999999999999999999999.001を「999999999999999999999.001」に変換する方法
私が試してみました
>> 9999999999999999999999.001.to_s
=> "1.0e+22"
>> "%f" % 9999999999999999999999.001
=> "10000000000000000000000.000000"
rubyで9999999999999999999999.001を「999999999999999999999.001」に変換する方法
私が試してみました
>> 9999999999999999999999.001.to_s
=> "1.0e+22"
>> "%f" % 9999999999999999999999.001
=> "10000000000000000000000.000000"
真実はあなたができないということです。書く数値は 22 桁で、ルビの浮動小数点数は 15 桁の精度しかありません。したがって、この変数を使用すると、クラス Float であるため、値の一部が「失われた」状態になります。
BigDecimal
標準ライブラリから使用します。
1.8.7 :005 > require 'bigdecimal'
=> true
1.8.7 :006 > BigDecimal('9999999999999999999999.001')
=> #<BigDecimal:7fe0cbcead70,'0.9999999999 9999999999 99001E22',36(36)>
1.8.7 :007 > BigDecimal('9999999999999999999999.001').to_s
=> "0.9999999999999999999999001E22"
もちろん、この例は、BigDecimal がそれだけの数を処理できることを示しているだけです。最初に番号を取得する場所はどこでも、計算/入力されたらすぐ9999999999999999999999.001
に取得する必要があります。BigDecimal
それをしてはいけない。理由は簡単です。最初から数値の値が正確に になるわけではありません9999999999999999999999.001
。浮動小数点数の精度はわずか 15 桁です。
ただし、他のタイプを使用して、目的を達成できます。
require 'bigdecimal'
a = BigDecimal("9999999999999999999999.001")
a.to_s("F")
>> "9999999999999999999999.001"
BigDecimal
より大きな実数の要求で精度が拡張されるため、制限は適用されません。
浮動小数点は、プロセッサの FPU を直接使用することを意図しているため、計算が高速ですが、そのため精度に制限があります。
EDIT特に@izomorphiusと彼の議論については、非常に短いコードサンプルです:
a = "34.101"
b = BigDecimal(a.to_s)
c = b ** 15
c.to_s("F")
>>> 98063348952510709441484.183684987951811295085234607613193907150561501
そうでなければ、最後の文字列を取得する方法を教えてください。