3

rubyで9999999999999999999999.001を「999999999999999999999.001」に変換する方法

私が試してみました

>> 9999999999999999999999.001.to_s
=> "1.0e+22"

>> "%f" % 9999999999999999999999.001
=> "10000000000000000000000.000000"
4

3 に答える 3

2

真実はあなたができないということです。書く数値は 22 桁で、ルビの浮動小数点数は 15 桁の精度しかありません。したがって、この変数を使用すると、クラス Float であるため、値の一部が「失われた」状態になります。

于 2013-01-12T11:05:23.663 に答える
2

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

于 2013-01-12T11:10:22.290 に答える
1

それをしてはいけない。理由は簡単です。最初から数値の値が正確に になるわけではありません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

そうでなければ、最後の文字列を取得する方法を教えてください。

于 2013-01-12T11:16:38.257 に答える