-3

この操作は を返す必要がありますが、浮動小数点表現のため、代わりに を2返します。1

a <- .3
b <- .1
floor((a-b)*10)

私は基本的に、浮動小数点コンピュータの結果ではなく、実際の 10 進数の結果のポイントの後の最初の桁が必要です。この場合ab10 進数は 1 桁しかありませんが、ほとんどの場合はそれ以上になります。例:

  • 0.3-0.1=0.2だから私は欲しい2
  • 0.5-0.001=0.499だから私は欲しい4
  • 0.925-0.113=0.812だから私は欲しい8
  • 0.57-0.11=0.46だから私は欲しい4
  • 0.12-0.11=0.01だから私は欲しい0

つまり、丸めではなく切り捨てです。私はこれを使用することを考えました:

floor(floor((a-b)*100)/10)

しかし、それが私にできる最善のことかどうかはわかりません。

更新:実際、機能しません(以下のコメントを参照):

floor(floor((.9-.8)*100)/10) # gives 0 instead of 1
floor(round((.5-.001)*100)/10) # gives 5 instead of 1

更新 2:これは機能すると思います (少なくとも、これまでにリストされているすべてのケースで):

substring(as.character(a-b),first=3,last=3)

提案?

4

1 に答える 1

1

情報が存在しないため、これは不可能です。double は 10 進数を正確に表すことができません。

近似解に問題がない場合は、小さな数値を追加して、結果を切り捨てることができます。たとえば、数字が最大 14 桁であることがわかっている場合は、次のようになります。

first_digit <- function(x, epsilon=5e-15)
  floor( (x+epsilon) * 10 )
first_digit( .3   - .1   ) # 2
first_digit( .5   - .001 ) # 4
first_digit( .925 - .113 ) # 8
first_digit( .57  - .11  ) # 4
first_digit( .12  - .11  ) # 0

最初の有効数字 (つまり、「ゼロ以外の最初の数字」を意味する) が必要な場合は、次を使用できます。

first_significant_digit <- function(x, epsilon=5e-14)
  floor( (x+epsilon) * 10^-floor(log10(x+epsilon)) )
first_significant_digit(0.12-0.11) # 1
于 2013-06-08T09:01:53.260 に答える