切断或截断为n位有效数字

时间:2017-09-18 22:35:45

标签: julia

Julia有一个内置函数可以舍入到n个有效数字。 signif(0.0229, 2)将舍入到两位有效数字并给出0.023

如何切换或截断n个有效数字,以便我得到0.022

2 个答案:

答案 0 :(得分:2)

嗯,不是很有想象力。使用@edit signif(0.229,2)查找源代码并将round替换为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

答案 1 :(得分:1)

我在Maple找到了一个版本并移植到Julia:

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))")