【问题标题】:calc digits/decimal places from resolution从分辨率计算数字/小数位数
【发布时间】:2026-02-26 18:00:01
【问题描述】:

有没有一种简单的方法来计算在给定分辨率下显示浮点数所需的位数? (不经过字符串转换)

resolution = [0.1 0.01 0.05 0.025 0.10001];

% first try
digits = -floor (log10 (resolution))

% wanted output
ex_digits = [1 2 2 3 5];

给予

digits =
   1   2   2   2   1

前三个结果很好,但另一个在我第一次尝试时失败了。

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

    您可以将数字乘以 10 的幂,然后将结果与其底数进行比较。

    resolution = [0.1 0.01 0.05 0.025 0.10001];
    k = resolution .* 10.^(1:20).';
    [~, digits] = max(round(k)==k);
    

    您也可以使用容差来考虑精度误差:

    r = round(k);
    tol = eps(r) * 2;
    [max_val, digits] = max(abs(r-k) < tol);
    digits = max_val .* digits + ~max_val .* 20;
    

    【讨论】:

    • 我称之为“蛮力”方法:乘以 10 直到没有小数部分。
    • 由于浮点表示,这对于许多值(如 [1.0+1.0e-9,1.23e-10] 和其他值)都失败了。你的容忍方法也不能像你描述的那样起作用
    • @Andy 使用round 而不是floor 更新答案。我希望它会产生更准确的结果。
    【解决方案2】:

    这样的事情似乎已经足够接近了:

    ceil( log10( [~, D] = rat( resolution, eps ) ) )
    

    【讨论】:

    • 有趣的是,0.025 注册为 2,而 0.024 和 0.026 注册为 3。如果我努力尝试,我可能会将此作为“错误作为功能”出售:p
    • 0.000128 或 0.00625 相同。