2017-09-18 14 views
2

Juliaには、有効数字の末尾にnの丸め機能が組み込まれています。 signif(0.0229, 2)は2桁の有効数字に丸められ、0.023となります。有効数字がn桁に切り詰められるか

n有効数字に切り詰めて切り捨てると、代わりに0.022が得られますか?

+0

'myfloor(X、D)=ラウンド(Xウィル-0.5 * 10.0 ^( - d)、d) '十分に良い? –

+0

'myfloor(0.0229,2)'は '0.02'を返し、' 0.022'を返すべきです – clay

+0

ああ...私は質問して、誤解しています。しかし、以下の答えには時間がかかるものの、実用的な提案があります。 –

答えて

3

まあ、それほど想像力はありません。 @edit signif(0.229,2)を使用して、ソースを検索し、をfloorに置き換えてください(正確なモジュール参照についてはBase.が追加されています)。ここでの結果は次のとおりです。

function mysignif(x::Real, digits::Integer, base::Integer=10) 
    digits < 1 && throw(DomainError(digits, "`digits` cannot be less than 1.")) 

    x = float(x) 
    (x == 0 || !isfinite(x)) && return x 
    og, e = Base._signif_og(x, digits, base) 
    if e >= 0 # for numeric stability 
     r = trunc(x/og)*og 
    else 
     r = trunc(x*og)/og 
    end 
    !isfinite(r) ? x : r 
end 

は与える:

julia> mysignif(0.0229,2) 
0.022 
+0

印象的です。負数は正しく処理されません。私はあなたがそれを簡単に修正できると確信しています。 – clay

+0

@clayはい、簡単に修正できます(実際には、ネガの動作はアプリケーションによって異なります)。修正するには、 'floor'を' trunc'に置き換えてください[私も答えでそれを行います] –

1

を私はメイプルでのバージョンを発見したとジュリアへの移植:

function signifChop(num, digits) 
    if num == 0.0 then 
     return num 
    else 
     e = ceil(log10(abs(num))) 
     scale = 10^(digits - e) 
     return trunc(num * scale)/scale 
    end 
end 

# Test cases for signifChop 
println("$(signifChop(124.031, 5))") 
println("$(signifChop(124.036, 5))") 
println("$(signifChop(-124.031, 5))") 
println("$(signifChop(-124.036, 5))") 
println("$(signifChop(0.00653, 2))") 
println("$(signifChop(0.00656, 2))") 
println("$(signifChop(-0.00653, 2))") 
println("$(signifChop(-0.00656, 2))") 
関連する問題