Julia 切掉或截断为n个有效数字

Julia 切掉或截断为n个有效数字,julia,Julia,Julia有一个内置函数,可以舍入到n有效数字符号(0.0229,2)将四舍五入为两个有效数字,并给出0.023 我怎样才能切掉或截断到n有效数字,从而得到0.022?嗯,不是很有想象力。使用@edit signif(0.229,2)查找源代码,并将round替换为floor(并添加了底座。,用于正确的模块引用)。结果如下: function mysignif(x::Real, digits::Integer, base::Integer=10) digits < 1 &&

Julia有一个内置函数,可以舍入到
n
有效数字<代码>符号(0.0229,2)将四舍五入为两个有效数字,并给出
0.023


我怎样才能切掉或截断到
n
有效数字,从而得到
0.022

嗯,不是很有想象力。使用
@edit signif(0.229,2)
查找源代码,并将
round
替换为
floor
(并添加了
底座。
,用于正确的模块引用)。结果如下:

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

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

myfloor(x,d)=圆形(x-0.5*10.0^(-d),d)
足够好吗?
myfloor(0.0229,2)
产生
0.02
,它应该产生
0.022
啊。。。我明白了,我误解了这个问题。但在下面的答案中有一个冗长但有效的建议。令人印象深刻。它不能正确处理负数。我相信您可以很容易地修复它。@clay是的,它很容易修复(事实上,底片上所需的行为取决于应用程序)。若要修复,请将
地板
替换为
trunc
[我也会在答案中这样做]
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))")